Joh*_*ny5 11 c# events event-handling
我知道以下两种方法都有效,但我想知道在性能/维护方面是否更好.
简短的方法:
public event EventHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)
漫长的道路:
private EventHandler _myEvent;
public event EventHandler MyEvent
{
add { _myEvent += value; }
remove { _myEvent -= value; }
}
Run Code Online (Sandbox Code Playgroud)
漫长的方式似乎与封装具有属性的成员类似,这确实是一种很好的做法.但是这适用于事件处理程序吗?
Mar*_*ell 28
在这种情况下,"良好实践"的论点有点琐碎; 第一个是"田野般的事件"; 你注意到:
漫长的方式似乎与封装具有属性的成员类似,
但是:这是封装的(在add/ 后面remove); 所以通过与属性的比较,它实际上是区别:
public int Foo {get;set;}
Run Code Online (Sandbox Code Playgroud)
和
private int foo;
public int Foo {
get { return foo; }
set { foo = value; }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我会说"使用第一个,除非你有一个实际的理由不" - 它仍然隐藏在访问者后面.此外,重要的是要注意,您的第二个示例不是类似字段的事件(第一个示例)扩展到:编译器将线程安全性添加到组合中.所以:我会说使用第一个样本:
public event EventHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)
请注意,线程安全的"方式"取决于您使用的编译器版本(实际上是哪个规范).在最近的Microsoft C#编译器中,它通过Interlocked操作(CompareExchange等)来完成此操作,因此它不需要专用的私有同步对象.
第一种方式完全相同,创建私有EventHandler名称MyEvent.当它在类中被访问时,在类(myClassInstance.MyEvent += SomeHandler/ myClassInstance.MyEvent -= SomeHandler)Add/ Remove方法之外调用它时,返回它们(即调用委托没有问题).并且这些方法与您以第二种方式编写的方法相同(除了它们添加了线程安全性).
那你为什么要在实际不需要的时候编写更多代码呢?
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |