2011-08-16 38 views
12

我下载ReSharper的,它是告诉我要改变这一行:删除多余的委托构造函数调用?

dispMap.OnDraw += new EventHandler(dispMap_OnDraw); 

为了这一行:“多余的委托构造函数调用”

dispMap.OnDraw += dispMap_OnDraw; 

因为第一行是

这是真的吗?在自动生成的设计器代码表单中,语法基于第一段代码,当在dispMap.OnDraw +=中打字并点击TAB时,IDE自动生成new EventHandler(dispMap_OnDraw)

我只是对这一个好奇而已。 ReSharper有一点意义吗?

回答

10

是的,这是正确的。我在几种情况下做了这个。

委托构造函数调用应该是隐式的;该类型可以从OnDraw推断出来,并根据方法签名dispMap_OnDraw进行验证。

此外,从this MSDN article报价出现相关:

由于+ =操作者只需串接一个委托的内部调用 列表到另一个,你可以用+ =添加一个 匿名方法。请注意,对于匿名事件处理,除非已将 匿名方法作为处理程序添加为 委托人,然后使用该事件注册该委托人,否则您不能使用 - =运算符删除事件处理方法。

我相信委托实例被创建无论哪种方式,但因为你没有一个对象引用委托时隐式实例化,你不能与-=运营商将其删除。

5

它确实有一点。第二行是第一行的简写。根据您的编码标准/惯例,您可以使用任意一种,但第一种增加了很多噪音。

0

它工作正常,我有DevExpress和它告诉我一样!

3

如果比较两种情况下生成的IL,你会发现它们是相同的。下面是在C#中这两种情况下,和IL它们导致

实例C#:

namespace EventTest 
{ 
    public class Publisher 
    { 
     public delegate void SomeEvent(object sender); 
     public event SomeEvent OnSomeEvent; 
     public event SomeEvent OnOtherEvent; 
    } 

    public class Subscriber 
    { 
     public Subscriber(Publisher p) 
     { 
      p.OnSomeEvent += new Publisher.SomeEvent(Respond); 
      p.OnOtherEvent += Respond; 
     } 

     public void Respond(object sender) 
     { 

     } 
    } 
} 

这里的IL的构造函数。注意行IL_000aIL_0028

.method public hidebysig specialname rtspecialname 
     instance void .ctor(class EventTest.Publisher p) cil managed 
{ 
    // Code size  48 (0x30) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: call  instance void [mscorlib]System.Object::.ctor() 
    IL_0006: nop 
    IL_0007: nop 
    IL_0008: ldarg.1 
    IL_0009: ldarg.0 
    IL_000a: ldftn  instance void EventTest.Subscriber::Respond(object) 
    IL_0010: newobj  instance void EventTest.Publisher/SomeEvent::.ctor(object, 
                      native int) 
    IL_0015: callvirt instance void EventTest.Publisher::add_OnSomeEvent(class EventTest.Publisher/SomeEvent) 
    IL_001a: nop 
    IL_001b: ldarg.1 
    IL_001c: ldarg.0 
    IL_001d: ldftn  instance void EventTest.Subscriber::Respond(object) 
    IL_0023: newobj  instance void EventTest.Publisher/SomeEvent::.ctor(object, 
                      native int) 
    IL_0028: callvirt instance void EventTest.Publisher::add_OnOtherEvent(class EventTest.Publisher/SomeEvent) 
    IL_002d: nop 
    IL_002e: nop 
    IL_002f: ret 
} 

结论:我没有看到任何更改代码的理由,它们是等价的。