我知道以下两种方法有效,但我想知道在性能/维护等方面是否更好。
捷径:
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/