不能在没有附加处理程序的C#中激发事件。因此,在每次调用之前,都有必要检查事件是否为空。
if ( MyEvent != null ) {
MyEvent( param1, param2 );
}
我希望尽可能保持代码的整洁,并摆脱那些空检查。我认为这不会对性能有太大影响,至少在我的情况下不会。
MyEvent( param1, param2 );
现在,我通过手动为每个事件添加一个空的内联处理程序来解决这个问题。这很容易出错,因为我需要记住这样做,等等。
void Initialize() {
MyEvent += new MyEvent( (p1,p2) => { } );
}
有没有一种方法可以使用反射和一些CLR魔法自动为给定类的所有事件生成空处理程序?
发布于 2008-12-04 13:53:11
符号:
if ( MyEvent != null ) {
MyEvent( param1, param2 );
}
不是线程安全的。你应该这样做:
EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }
我理解,这很麻烦,所以你可以做helper方法:
static void RaiseEvent( EventHandler handler, object sender, EventArgs e ) {
if ( null != handler ) { handler( sender, e ); }
}
然后打电话给:
RaiseEvent( MyEvent, param1, param2 );
如果您使用的是C# 3.0,您可以将助手方法声明为扩展方法:
static void Raise( this EventHandler handler, object sender, EventArgs e ) {
if ( null != handler ) { handler( sender, e ); }
}
然后打电话给:
MyEvent.Raise( param1, param2 );
您还可以为其他事件处理程序创建下一个扩展/帮助器方法。例如:
static void Raise<TEventArgs>( this EventHandler<TEventArgs> handler,
object sender, TEventArgs e ) where TEventArgs : EventArgs
{
if ( null != handler ) { handler( sender, e ); }
}
发布于 2017-06-09 16:19:43
多亏了条件空运算符?.
,在C# 6.0中,不需要使用这些长度中的任何一个来执行null检查
The docs解释说,调用MyEvent?.Invoke(...)
会将事件复制到临时变量,执行null检查,如果不是null,则在临时副本上调用Invoke
。这在任何意义上都不一定是线程安全的,因为有人可能已经在临时变量的副本之后添加了一个新事件,而这个临时变量不会被调用。但它可以保证你不会在null上调用Invoke
。
简而言之:
public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click;
public void DoSomething() {
Click?.Invoke(this, "foo");
}
发布于 2008-12-04 13:44:40
你可以这样写:
MyEvent += delegate { };
我不确定你想做什么是正确的。
https://stackoverflow.com/questions/340610
复制相似问题