2009-11-17 3 views
16

बेनामी तरीकों की तरह, प्रतिनिधियों को मैं "प्रतिनिधि" कीवर्ड का उपयोग करके घोषित कर रहा हूं अनाम प्रतिनिधि हैं?सी # - बेनामी प्रतिनिधि

namespace Test 
{ 
    public delegate void MyDelegate(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DelegateTest tst = new DelegateTest(); 
      tst.Chaining(); 
      Console.ReadKey(true); 
     } 
    } 

    class DelegateTest 
    { 
     public event MyDelegate del; 

     public void Chaining() 
     { 
      del += delegate { Console.WriteLine("Hello World"); }; 
      del += delegate { Console.WriteLine("Good Things"); }; 
      del += delegate { Console.WriteLine("Wonderful World"); }; 
      del(); 
     } 
    } 
} 

उत्तर

19

उदाहरण में आपका प्रतिनिधि संग्रह कई अज्ञात विधियों को इंगित करता है। एक प्रतिनिधि "बस एक विधि सूचक" है। इससे कोई फर्क नहीं पड़ता कि यह वास्तविक विधि या अज्ञात विधि को इंगित करता है।

कृपया देखें http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

2

हां। बेनामी प्रतिनिधियों को सीधे नाम से संदर्भित नहीं किया जा सकता है, इसलिए delegate(){} सिंटैक्स का उपयोग करने का अर्थ है कि वे अज्ञात हैं।

1

वे गुमनाम तरीकों के प्रतिनिधियों कर रहे हैं। यह अज्ञात विधियों को बनाने का एक तरीका है, जो .NET 2.0 के बाद उपलब्ध था। .NET 3.0 के साथ आप लैम्ब्डा अभिव्यक्तियों का भी उपयोग कर सकते हैं जो लिखने के लिए सरल हैं (लेकिन एक ही कोड को संकलित करें)। मुझे लगता है कि आप "अनामिक तरीकों" के साथ क्या मतलब है। लेकिन वास्तव में, वे एक और एक ही बात हैं।

+0

लैम्ब्डा सिंटैक्स में लैम्ब्डा अभिव्यक्तियां और अज्ञात विधियां वास्तव में समान नहीं हैं। यदि आप घुंघराले ब्रेसिज़ के साथ लैम्ब्डा सिंटैक्स का उपयोग करते हैं तो आपका कथन सत्य है: (x) => {y();} – Lucero

4

यह सही है, आपने किसी ईवेंट में कई अज्ञात विधियां असाइन की हैं।

यदि आप सी # का एक नया संस्करण उपयोग कर रहे हैं, तो आप लैम्बडास के समान कुछ भी कर सकते हैं। उदाहरण के लिए:

class DelegateTest 
{ 
    public event Action del; 

    public void Chaining() 
    { 
     del +=() => Console.WriteLine("Hello World"); 
     del +=() => Console.WriteLine("Good Things"); 
     del +=() => Console.WriteLine("Wonderful World"); 
     del(); 
    } 
} 
+2

क्या आपका मतलब सी # 3.0 है? – user160677

23

एक "गुमनाम प्रतिनिधि" जैसी कोई चीज नहीं है (या बल्कि, कि सी # विनिर्देश में एक मान्यता प्राप्त अवधि, या किसी अन्य नेट से संबंधित विनिर्देश मैं के बारे में पता कर रहा हूँ नहीं है)।

अज्ञात कार्य हैं जिनमें अज्ञात विधियां और लैम्ब्डा अभिव्यक्तियां शामिल हैं।

आपका कोड सादे पुराने अज्ञात तरीकों को दिखाता है - हालांकि वे एक सुविधा का उपयोग कर लैम्ब्डा अभिव्यक्तियों का उपयोग नहीं करते हैं: जब आप उनकी परवाह नहीं करते हैं तो पैरामीटर को व्यक्त करने की क्षमता नहीं होती है।

+0

उम्म। आप इस पर स्पष्ट कर सकते हैं .. हम आम तौर पर देख "बेनामी प्रतिनिधियों" शब्द हर जगह भी है शब्द "बेनामी तरीके" के रूप में MSDN में प्रयोग किया जाता है, तो हम कह में गलत पूर्व कर रहे हैं या दोनों सही हैं .. –

+0

@Shekhar_Pro इस्तेमाल किया: "बेनामी तरीकों "सही है। "बेनामी प्रतिनिधि" गलत है। आप कहते हैं कि आप "आम तौर पर देखते हैं [यह] हर जगह" - आप विशिष्ट स्थानों का हवाला देते हैं सकता है? –

+0

किसी भी आधिकारिक दस्तावेज़ में नहीं बल्कि नेटिजेंस द्वारा उपयोग की जाने वाली सामान्य शब्दावली। जैसा ... अतः ही .. http://stackoverflow.com/search?q=anonymous+delegate .... तो लगता है कि हम गलत शब्द का प्रयोग करने की आदत में चले गए हैं। –

2

आपका प्रतिनिधि अज्ञात नहीं है। इसे माईडेलेगेट कहा जाता है। सीएलआर में प्रतिनिधि एक वर्ग है जो सिस्टम से प्राप्त होता है। मल्टीकास्टडिलेगेट और आपके मामले में इसे माईडेलेगेट कहा जाता है। आप मल्टीकास्टडिलेगेट से सीधे प्राप्त नहीं कर सकते हैं, सी # कंपाइलर आपको रोक देगा।

अपने कोड में आप डेल प्रतिनिधियों आवंटित जब, प्रतिनिधि के प्रकार/नाम संकलक द्वारा मान लिया जाता है क्योंकि आप प्रकार MyDelegate की घटना के रूप में डेल की घोषणा की।