首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自动创建空的C#事件处理程序

自动创建空的C#事件处理程序
EN

Stack Overflow用户
提问于 2008-12-04 13:41:29
回答 7查看 53.2K关注 0票数 74

不能在没有附加处理程序的C#中激发事件。因此,在每次调用之前,都有必要检查事件是否为空。

代码语言:javascript
复制
if ( MyEvent != null ) {
  MyEvent( param1, param2 );
}

我希望尽可能保持代码的整洁,并摆脱那些空检查。我认为这不会对性能有太大影响,至少在我的情况下不会。

代码语言:javascript
复制
MyEvent( param1, param2 );

现在,我通过手动为每个事件添加一个空的内联处理程序来解决这个问题。这很容易出错,因为我需要记住这样做,等等。

代码语言:javascript
复制
void Initialize() {
  MyEvent += new MyEvent( (p1,p2) => { } );
}

有没有一种方法可以使用反射和一些CLR魔法自动为给定类的所有事件生成空处理程序?

EN

回答 7

Stack Overflow用户

发布于 2008-12-04 13:53:11

符号:

代码语言:javascript
复制
if ( MyEvent != null ) {
  MyEvent( param1, param2 );
}

不是线程安全的。你应该这样做:

代码语言:javascript
复制
EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

我理解,这很麻烦,所以你可以做helper方法:

代码语言:javascript
复制
static void RaiseEvent( EventHandler handler, object sender, EventArgs e ) {
    if ( null != handler ) { handler( sender, e ); }
}

然后打电话给:

代码语言:javascript
复制
RaiseEvent( MyEvent, param1, param2 );

如果您使用的是C# 3.0,您可以将助手方法声明为扩展方法:

代码语言:javascript
复制
static void Raise( this EventHandler handler, object sender, EventArgs e ) {
    if ( null != handler ) { handler( sender, e ); }
}

然后打电话给:

代码语言:javascript
复制
MyEvent.Raise( param1, param2 );

您还可以为其他事件处理程序创建下一个扩展/帮助器方法。例如:

代码语言:javascript
复制
static void Raise<TEventArgs>( this EventHandler<TEventArgs> handler,
    object sender, TEventArgs e ) where TEventArgs : EventArgs
{
    if ( null != handler ) { handler( sender, e ); }
}
票数 61
EN

Stack Overflow用户

发布于 2017-06-09 16:19:43

多亏了条件空运算符?.,在C# 6.0中,不需要使用这些长度中的任何一个来执行null检查

The docs解释说,调用MyEvent?.Invoke(...)会将事件复制到临时变量,执行null检查,如果不是null,则在临时副本上调用Invoke。这在任何意义上都不一定是线程安全的,因为有人可能已经在临时变量的副本之后添加了一个新事件,而这个临时变量不会被调用。但它可以保证你不会在null上调用Invoke

简而言之:

代码语言:javascript
复制
public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click;

public void DoSomething() {
    Click?.Invoke(this, "foo");
}
票数 10
EN

Stack Overflow用户

发布于 2008-12-04 13:44:40

你可以这样写:

代码语言:javascript
复制
MyEvent += delegate { };

我不确定你想做什么是正确的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/340610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档