c# - 在 C# 中声明事件的最佳实践

标签 c# events event-handling

我知道以下两种方法有效,但我想知道在性能/维护等方面是否更好。

捷径:

  public event EventHandler MyEvent;

漫漫长路:

  private EventHandler _myEvent;
  public event EventHandler MyEvent
  {
     add { _myEvent += value; }
     remove { _myEvent -= value; }
  }

长途跋涉似乎类似于用属性封装成员,这确实是一个很好的做法。但这是否适用于事件处理程序?

最佳答案

在这种情况下,“良好实践”的论点有点狡猾;第一个是“类场事件”;你注意到:

The long way seems similar to encapsulating members with properties,

但是:无论哪种方式,这都是封装的(在 add/remove 之后);因此,与属性相比,两者之间的真正区别在于:

public int Foo {get;set;}

private int foo;
public int Foo {
    get { return foo; }
    set { foo = value; }
}

在这种情况下,我会说“使用第一个,除非你有真正的理由不这样做”——它仍然隐藏在访问器后面。此外,请务必注意,您的第二个示例不是类似字段的事件(第一个示例)扩展到的内容:编译器将线程安全性添加到混合中。所以:我会说使用第一个示例:

public event EventHandler MyEvent;

请注意,线程安全的“方式”取决于您使用的编译器版本(实际上是哪个规范)。在最近的 Microsoft C# 编译器中,它通过 Interlocked 操作(CompareExchange 等)执行此操作,因此不需要专用的私有(private)同步对象。

关于c# - 在 C# 中声明事件的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16792542/

相关文章:

asp.net - 将事件附加到控件

templates - meteor :检测嵌套模板中的事件

java - gui 帮助...使用 actionListener

c# - 一个重构代码如何参与嵌套使用?

c# console app 按下空格键而不在屏幕上显示

javascript - Gulp - 通过 ftp 上传文件后通知

android - 在 Kotlin 中处理事件总线的通用监听器

android - OnpageScrolled 在 Viewpager 中工作两次

c# - MSBuild 日志文件位置

c# - C++ 模板和 C# 泛型