2011-08-16 19 views
12

मैं ReSharper डाउनलोड किया है और यह मेरे इस लाइन को बदलने के लिए कह रहा है:अनावश्यक प्रतिनिधि कन्स्ट्रक्टर कॉल निकालें?

dispMap.OnDraw += new EventHandler(dispMap_OnDraw); 

इस लाइन होने के लिए: "। बेमानी प्रतिनिधि निर्माता कॉल"

dispMap.OnDraw += dispMap_OnDraw; 

क्योंकि पहली पंक्ति है

क्या यह सच है? रूपों के लिए स्वचालित रूप से उत्पन्न डिजाइनर कोड में वाक्य रचना कोड के पहले टुकड़े पर आधारित है और जब dispMap.OnDraw += में टाइप और टैब मार आईडीई स्वत: जनरेट करता new EventHandler(dispMap_OnDraw)

मैं इस एक के बारे में बस उत्सुक हूँ। क्या ReSharper एक बिंदु है?

उत्तर

10

हां, यह सही है। मैंने कई मामलों में ऐसा किया है।

प्रतिनिधि कन्स्ट्रक्टर कॉल निहित होना चाहिए; इस प्रकार को OnDraw से अनुमानित किया जा सकता है और dispMap_OnDraw के विधि हस्ताक्षर के विरुद्ध सत्यापित किया जा सकता है।

इसके अलावा, this MSDN article से एक उद्धरण प्रासंगिक प्रकट होता है:

क्योंकि + = ऑपरेटर केवल एक-दूसरे के लिए एक प्रतिनिधि के आंतरिक मंगलाचरण सूची संयोजित करता है, तो आप + = एक गुमनाम विधि जोड़ने के लिए उपयोग कर सकते हैं। ध्यान दें कि अज्ञात ईवेंट हैंडलिंग के साथ, आप नहीं कर सकते हैं - = ऑपरेटर का उपयोग करके इवेंट हैंडलिंग विधि को हटाएं जब तक कि अज्ञात विधि को हैंडलर के रूप में जोड़ा गया था, इसे पहले प्रतिनिधि को संग्रहीत करके और फिर उस प्रतिनिधि को ईवेंट के साथ पंजीकृत करना।

मेरा मानना ​​है कि प्रतिनिधि उदाहरण किसी भी तरह से बनाया जाता है, लेकिन जब से तुम प्रतिनिधि के लिए एक वस्तु संदर्भ की जरूरत नहीं है जब आप परोक्ष का दृष्टांत, आप इसे -= ऑपरेटर के साथ नहीं निकाल सकते।

5

इसमें एक बिंदु है। दूसरी पंक्ति पहले के लिए शॉर्टेंड है। आपके कोडिंग मानकों/सम्मेलनों के आधार पर, आप किसी एक का उपयोग कर सकते हैं, लेकिन पहला व्यक्ति बहुत शोर जोड़ता है।

0

यह ठीक काम करता है, मेरे पास DevExpress है और यह मुझे वही बताता है!

3

यदि आप दोनों मामलों में उत्पन्न आईएल की तुलना करते हैं, तो आप देखेंगे कि वे वही हैं। यहाँ सी # में दोनों ही मामलों है, और आईएल वे में परिणाम

उदाहरण सी #:।

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_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 
} 

निष्कर्ष: मुझे आपके कोड को बदलने का कोई कारण नहीं दिख रहा है, वे समकक्ष हैं।

संबंधित मुद्दे