C# c语言中的事件处理程序
事件处理程序的最佳做法是:C# c语言中的事件处理程序,c#,c#-4.0,programming-languages,C#,C# 4.0,Programming Languages,事件处理程序的最佳做法是: class Plane { public event EventHandler Land; protected void OnLand() { if ( null != Land ) { Land( this, null ); } } } 这真的有必要吗?在什么情况下temp与Land不同?我相信在多线程访问的情况下。如果您不缓存引用,另一个线程可以在您的保
class Plane
{
public event EventHandler Land;
protected void OnLand()
{
if ( null != Land )
{
Land( this, null );
}
}
}
这真的有必要吗?在什么情况下temp与Land不同?我相信在多线程访问的情况下。如果您不缓存引用,另一个线程可以在您的保护之后但在您触发之前将其清空 如果在测试和提升之间,有多个线程同时修改
Land
,则最后一个处理程序将由另一个线程从列表中删除
事件的调用列表将在其更改时被复制,临时引用仍将保留原始列表
请参阅:我看不到您订阅活动的位置。如果要尝试更新用户界面,您可能还需要检查是否需要调用。我很确定,由于EventHandler是一种引用类型,如果在null检查之后但在调用之前,Land为null,它仍然会抛出null referenceexception,这就是我的观点。将引用缓存为“temp”作为最佳实践,这样就不会发生这种情况,也不会引发异常。Temp继续指向内存中方法作用域的对象,因此调用Temp不会引发异常。抱歉。这不是我习惯于的方式。但是一个快速的scratch程序暴露了我的错误。不幸的是,除非你编辑你的答案,否则我无法逆转我的投票。+1还有一个微妙的区别:事件是不可变的,就像字符串一样。So
事件动作MyEvent;MyEvent+=()=>Console.WriteLine(“你好1”);var-temp=MyEvent;MyEvent+=()=>Console.WriteLine(“Hello 2”);温度()
将只打印Hello 1
,因为temp有MyEvent的“旧”副本。
EventHandler temp = Land;
if ( null != temp )
{
temp( this, null );
}