2011-08-16 14 views
12

私はReSharperのをダウンロードし、この行を変更するために私に言っている:この行であるために冗長デリゲートコンストラクタコールを削除しますか?

dispMap.OnDraw += new EventHandler(dispMap_OnDraw); 

を:「冗長デリゲートコンストラクタ呼び出し」最初の行であるため

dispMap.OnDraw += dispMap_OnDraw; 

これは本当ですか?自動的に生成されたフォームのデザイナーコードでは、構文は最初のコードに基づいており、dispMap.OnDraw +=と入力するとIDEが自動的に生成されます。new EventHandler(dispMap_OnDraw)

私はこの点について興味があります。 ReSharperにはポイントがありますか?

答えて

10

はい、これは正しいです。私はいくつかのケースでこれを行っています。

デリゲートコンストラクタコールは暗黙的に指定する必要があります。型はOnDrawから推測され、dispMap_OnDrawのメソッドシグネチャに対して検証されます。

また、this MSDN articleからの引用は、関連する表示されます。

+ =演算子は単に別のデリゲートの内部呼び出し リストを連結しているので、あなたは+ = 匿名メソッドを追加するために使用することができます。匿名のイベント処理では、 匿名メソッドがハンドラとして追加されていない限り、最初に デリゲートに格納し、そのデリゲートをイベントに登録しない限り、 - =演算子を使用してイベント処理メソッドを削除することはできません。

私は、デリゲートのインスタンスがいずれかの方法で作成されていますが、暗黙的にインスタンス化するときに、デリゲートのオブジェクト参照を持っていないので、あなたは-=演算子でそれを削除することはできませんと信じています。

5

ポイントがあります。 2行目は最初の行の略語です。あなたのコーディングの標準/慣行によってはどちらかを使うことができますが、最初のものは多くのノイズを加えます。

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 
} 

結論:コードを変更する理由はありません。これらは同等です。

関連する問題