在 C# 中使用可空引用类型 (NRT) 之前,事件和触发器方法将如下声明:
public event EventHandler MyEvent;
private void TriggerEvent()
{
this.MyEvent?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
现在,启用 NRT 后,事件类型应该声明为EventHandler或EventHandler?:
public event EventHandler MyEvent;
// or
public event EventHandler? MyEvent;
private void TriggerEvent()
{
this.MyEvent?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
我想说,EventHandler?但我能找到的所有 C# 文档(仍然)都说EventHandler(without ?)。
更新:编辑此问题是因为有人(?)将其标记为此问题的重复项- 这显然不是重复项。我知道什么?意思。这不是这里的问题。
C# 8 向 C# 添加了范围语法:
var slice = myArray[0..2];
Run Code Online (Sandbox Code Playgroud)
我发现不太直观的是上限(2在前面的示例中)是排他性的- 不包括在内;即myArray[0..2]返回具有 2 个元素(0 和 1)而不是 3 个元素的切片。
所以我的问题是:为什么C#语言设计者选择让上限独占?
无论是范围文档以及在设计冠军的问题只是状态上界是唯一的-不给任何解释,为什么(至少没有我能找到)。在 GitHub 上也有一个关于这个的讨论,但它似乎也没有包含任何官方解释。
通过搜索 StackOverflow,我偶然发现了 Python的相同问题。Python 也将上限视为排他的。所以我可以想象 C# 语言设计者正在研究其他语言(有范围)并试图使 C# 的行为与其他语言保持一致。但我仍然想知道是否有关于这个决定的任何官方文件。
有没有办法重新加载在 Visual Studio 之外编辑的属性表?Visual Studio 不会自动检测到文件已被修改(就像对待项目文件一样)。到目前为止,我发现的唯一方法是关闭并重新打开整个解决方案(但这不是好方法)。
我正在尝试用C++创建一些自注册类.所以我尝试了类似于此处提供的解决方案.在这样做时,我偶然发现了一些奇怪的事情.
这是代码:
#include <iostream>
class StaticClassType {
public:
StaticClassType() {
// Notify when the static member is created
std::cout << "We're in." << std::endl;
}
};
template<typename T>
class TestClass1 {
public:
TestClass1() { &m; }
private:
// Static member in a template class
static StaticClassType m;
};
template<typename T>
StaticClassType TestClass1<T>::m;
class TestClass2 : public TestClass1<TestClass2> {
public:
TestClass2() { } // required; why?
};
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码TestClass1::m在启动时创建静态成员变量(从而在控制台上打印"We are in.") - …
假设这个C函数:
void do_something(const char* str)
Run Code Online (Sandbox Code Playgroud)
它将字符串存储在某处以供以后参考.
此外,我在C#中有这个签名来调用这个函数:
[DllImport("NativeLib")]
static extern void do_something(string str);
Run Code Online (Sandbox Code Playgroud)
现在,将字符串传递给此方法时需要做什么:
GCHandle.Alloc())(或是编组创建副本)?GCHandle.Alloc())?或者我需要传递返回值GCHandle.AddrOfPinnedObject()吗?string是正确的数据类型do_something?或者我应该使用IntPtr?我有一个 C# 堆栈跟踪,其中包含如下行:
at MyNamespace.WCFService.<DispatchWork>b__4(Task`1 t)
at MyNamespace.TestMethods.<RunTestCode>d__0.MoveNext()
at MyNamespace.ServiceProxy.<CallService>d__4a.MoveNext()
Run Code Online (Sandbox Code Playgroud)
b__4、d__0、 和是什么d__4a意思?
b__和 和有什么区别d__?d除了和之外还有其他字符吗b?
后面的东西是什么__?
使用WCF,假设以下服务接口:
[ServiceContract]
public interface IForDataTypeA
{
[OperationContract]
List<DataTypeA> GetValues();
}
[DataContract]
public class DataTypeA { }
Run Code Online (Sandbox Code Playgroud)
这是它在服务器端(服务主机)定义的方式.
现在,某人 - 无法访问服务器的源代码 - 尝试使用此WCF服务.他自己定义了服务接口,但不小心将数据类型的名称更改为DataTypeB:
[ServiceContract]
public interface IForDataTypeA
{
[OperationContract]
List<DataTypeB> GetValues();
}
[DataContract]
public class DataTypeB { }
Run Code Online (Sandbox Code Playgroud)
当他现在调用GetValues()(via ChannelFactory<IForDataTypeA>)时,返回的列表将始终为空,但不会抛出任何异常.
当列表中的元素无法反序列化(而不是返回空列表)时,有没有办法让WCF抛出异常?
这是重现问题的完整代码:
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace TestProj
{
[DataContract]
public class DataTypeA { }
[DataContract]
public class DataTypeB { }
[ServiceContract]
public interface IForDataTypeA
{
[OperationContract]
List<DataTypeA> GetValues();
} …Run Code Online (Sandbox Code Playgroud) 在我的.NET应用程序中,我必须重放一系列传感器事件.所以我创建了一个触发这些事件的线程(通常大约每1-4毫秒).我在这个线程中实现了一个循环,用于Thread.Sleep(...)让线程在事件之间休眠.
基本上它看起来像这样:
void RunThread() {
var iter = GetAllEvents().GetEnumerator();
if (!iter.MoveNext()) {
return;
}
DateTime lastEventTime = iter.Current.Timestamp;
FireEvent(iter.Current);
while (iter.MoveNext()) {
MyEvent nextEvent = iter.Current;
int timeout = (int)(nextEvent.Timestamp - lastEventTime).TotalMilliseconds;
Thread.Sleep(timeout);
FireEvent(nextEvent);
lastEventTime = nextEvent.Timestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是Thread.Sleep()有时会尊重指定的超时,有时则不会.
我添加了一个检查(使用StopWatch,在上面的代码中不可见),关于睡眠实际花了多长时间.以下是一些结果:
Expected timeout of 1 ms but got 15 ms.
Expected timeout of 2 ms but got 13 ms.
Expected timeout of 3 ms but got 15 ms.
Expected timeout of 2 ms but …Run Code Online (Sandbox Code Playgroud) 我已经在这里阅读了一些帖子,常见的建议是如果加入三个字符串,stringbuilder是最有效的.
所有变量都是其他属性.
public string Summary
{
get
{
return Name.Replace("_", " ") + "<strong>[" + Total + " Devices - " + BadCount + " Offline, " + PendingCount + " Pending]</strong>";
}
}
Run Code Online (Sandbox Code Playgroud)
我加入四,是一个简单的连接适合或我应该使用stringbuilder?只是看起来有点矫枉过正.
我有一个类,它有一些我希望从调用者隐藏的数据成员(因为包含其类型的头显着增加了编译时间,并且它需要使用此类的每个项目添加其包含路径的附加路径).
该类用于QSharedDataPointer存储此数据.这样就可以使用默认的复制构造函数进行复制.
这个类的基本结构是:
class MyClass {
private:
QSharedDataPointer<MySharedClassData> m_data;
};
Run Code Online (Sandbox Code Playgroud)
如果没有在同一个头文件中定义MySharedClassData(继承自QSharedData),是否有任何花哨的技巧?或者还有其他隐藏数据字段的好方法吗?
我已经尝试了前向声明,MySharedClassData但这没有用(尽管事实m_data是这样private).
我目前可以解决的唯一解决方案是声明m_data为,QSharedDataPointer<QSharedData>但是每次我想要访问它时我都需要转换数据成员.有更好的解决方案吗?