小编Seb*_*ski的帖子

启用可为空引用类型的 C# 事件 - 如何声明?

在 C# 中使用可空引用类型 (NRT) 之前,事件和触发器方法将如下声明:

public event EventHandler MyEvent;

private void TriggerEvent()
{
    this.MyEvent?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

现在,启用 NRT 后,事件类型应该声明为EventHandlerEventHandler?

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# events

7
推荐指数
1
解决办法
1385
查看次数

C#:为什么范围的上限是互斥的?

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# 的行为与其他语言保持一致。但我仍然想知道是否有关于这个决定的任何官方文件。

c# c#-8.0

6
推荐指数
1
解决办法
255
查看次数

如何在 Visual Studio 2010 中重新加载属性表

有没有办法重新加载在 Visual Studio 之外编辑的属性表?Visual Studio 不会自动检测到文件已被修改(就像对待项目文件一样)。到目前为止,我发现的唯一方法是关闭并重新打开整个解决方案(但这不是好方法)。

visual-studio-2010 propertysheet visual-studio

5
推荐指数
1
解决办法
1320
查看次数

C++中模板类中的静态字段初始化

我正在尝试用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++ static templates static-members

5
推荐指数
1
解决办法
3179
查看次数

在P/Invoke中为固定字符串传递什么?

假设这个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# pinvoke pinning

5
推荐指数
1
解决办法
1451
查看次数

解释 C# 堆栈跟踪

我有一个 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__4d__0、 和是什么d__4a意思?

b__和 和有什么区别d__d除了和之外还有其他字符吗b

后面的东西是什么__

c# stack-trace

5
推荐指数
1
解决办法
739
查看次数

如果项类型不匹配,WCF将无法反序列化列表

使用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)

c# wcf serialization datacontractserializer

5
推荐指数
0
解决办法
591
查看次数

.NET Thread.Sleep()是随机不精确的

在我的.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)

.net multithreading

4
推荐指数
1
解决办法
933
查看次数

从属性返回字符串连接的最有效方法

我已经在这里阅读了一些帖子,常见的建议是如果加入三个字符串,stringbuilder是最有效的.

所有变量都是其他属性.

public string Summary
{
  get 
  {
    return Name.Replace("_", " ") + "<strong>[" + Total + " Devices - " + BadCount + " Offline, " + PendingCount + " Pending]</strong>";
  }
}
Run Code Online (Sandbox Code Playgroud)

我加入四,是一个简单的连接适合或我应该使用stringbuilder?只是看起来有点矫枉过正.

c# string stringbuilder concatenation

4
推荐指数
1
解决办法
963
查看次数

私有(隐藏)QSharedData

我有一个类,它有一些我希望从调用者隐藏的数据成员(因为包含其类型的头显着增加了编译时间,并且它需要使用此类的每个项目添加其包含路径的附加路径).

该类用于QSharedDataPointer存储此数据.这样就可以使用默认的复制构造函数进行复制.

这个类的基本结构是:

class MyClass {
private:
  QSharedDataPointer<MySharedClassData> m_data;
};
Run Code Online (Sandbox Code Playgroud)

如果没有在同一个头文件中定义MySharedClassData(继承自QSharedData),是否有任何花哨的技巧?或者还有其他隐藏数据字段的好方法吗?

我已经尝试了前向声明,MySharedClassData但这没有用(尽管事实m_data是这样private).

我目前可以解决的唯一解决方案是声明m_data为,QSharedDataPointer<QSharedData>但是每次我想要访问它时我都需要转换数据成员.有更好的解决方案吗?

c++ qt private-members qshareddata

3
推荐指数
1
解决办法
796
查看次数