公共事件EventHandler SomeEvent = delegate {};

bit*_*onk 0 c# events

我有点厌倦了在代码中发现所有这些无用的噪音:

private void RaiseSomeOtherEventIfItIsNotNull()
{
    if (this.SomeOtherEvent != null)
    {
        this.SomeOtherEvent(this, EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

在99.9%的案例中,我不在乎是否有人附加或者是否为空.刚举起活动!我真的不明白为什么c#编译器会让我写出所有这些噪音.

所以我虽然可以声明这样的事件:

public event EventHandler SomeOtherEvent = delegate { };
Run Code Online (Sandbox Code Playgroud)

这将允许我摆脱无用的空检查和无用的Raise*方法.我可以随时做:

this.SomeOtherEvent(this, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)

现在,当我在LutzRöder的Reflector中将标准方法与"我的"方法进行比较时,我发现了一些显着的差异.编译器已覆盖,Add{}并且Remove{}匿名委托有一个额外的静态实例:

[CompilerGenerated] 
private static EventHandler CS$<>9__CachedAnonymousMethodDelegate1;
Run Code Online (Sandbox Code Playgroud)

并且有这样的:

.method private hidebysig static void <.ctor>b__0(object, class [mscorlib]System.EventArgs) cil managed
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    .maxstack 8
    L_0000: nop 
    L_0001: ret 
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题:您是否在使用默认初始化这样的十进制事件中看到了任何问题或缺点?

Jon*_*eet 7

你已经展示了一个额外的方法,但不是额外的.额外的方法很好,IMO - 它只是代表无操作处理程序.不是问题.

额外的类有点令人惊讶,因为它正在改变添加/删除行为...编译器将始终为事件创建添加/删除方法,因为这是使它成为事件的原因.

我个人认为这很好 - 但另一种方法是编写扩展方法,例如

public static void Raise<T>(this EventHandler<T> handler, object sender, T args)
    where T : EventArgs
{
    if (handler != null)
    {
        handler(sender, args);
    }
}

public static void Raise(this EventHandler handler, object sender,
                         EventArgs args)
{
    if (handler != null)
    {
        handler(sender, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

myEvent.Raise(this, args);
Run Code Online (Sandbox Code Playgroud)

这将适用于所有EventHandlerEventHandler<T>事件.