2013-07-09 10 views
6

मैं प्रतिनिधियों पर MSDN page पढ़ रहा हूं और वे सरल दिखते हैं। फिर मैं उन कोडों को देख रहा था जो उनका उपयोग करते थे और मैंने यह देखा:इस प्रतिनिधि विधि क्या कर रही है?

public delegate void NoArguments(); 
public NoArguments Refresh = null; 
Refresh = new NoArguments(Reset); 

यह तीसरी पंक्ति है जो मुझे भ्रमित करती है। आप new एक प्रतिनिधि कैसे हो सकते हैं? यह एक वस्तु नहीं है, यह एक विधि है, या एक विधि के लिए एक प्रतिनिधि है। एमएसडीएन पेज पर उदाहरण के मुताबिक, एक प्रतिनिधि का उदाहरण बनाना सरल असाइनमेंट के माध्यम से है, आवंटन नहीं। इसके अलावा, प्रतिनिधियों के लिए पैरामीटर, Reset लेते हुए प्रतिनिधि के लिए new क्यों है, जब प्रतिनिधि घोषणा में कोई पैरामीटर नहीं होता है?

उत्तर

1

प्रतिनिधि "एक विधि के लिए प्रतिनिधि" है, लेकिन एक वस्तु भी है। यदि आप किसी भी डिकंपेलर में NoArguments देखते हैं, तो आप देखेंगे कि यह वास्तव में कई विधियों (Invoke, BeginInvoke, EndInvoke) के साथ MulticastDelegate से विरासत में प्राप्त कक्षा है।

ऐतिहासिक कारणों से, सी # आपको new NoArguments(method) का उपयोग करके उस कक्षा के उदाहरण बनाने की अनुमति देता है। हालांकि आधुनिक संस्करणों में यह शॉर्टकट नोटेशन method का भी समर्थन करता है जो वही काम करता है। दोनों मामलों में, वास्तव में Refresh में आपके पास ऑब्जेक्ट का प्रकार है।

+0

यह इंगित करने के लिए धन्यवाद कि यह वास्तव में एक कार्य सूचक है, न केवल एक कार्य सूचक है। – johnbakers

4

delegate कीवर्ड इंगित करता है कि जो अनिवार्य रूप से एक फ़ंक्शन हस्ताक्षर है, इसलिए Refresh किसी फ़ंक्शन के लिए पॉइंटर की तरह बन जाता है जिसमें कोई तर्क नहीं होता है। हालांकि, Refresh पॉइंटर को कुछ असाइन करने के लिए, आपको इसे इंगित करने के लिए एक फ़ंक्शन देना होगा। इस मामले में, यह Reset फ़ंक्शन है। और आगे, Reset फ़ंक्शन में कोई तर्क नहीं लेना चाहिए।

इसके अलावा, वाक्य रचना:

Refresh = Reset; 

भी वैध है, और अधिक औपचारिक वाक्य रचना के लिए बस वाक्यात्मक चीनी है:

Refresh = new NoArguments(Reset); 
दोनों ही मामलों में

, आप तो समारोह रीसेट निष्पादित कर सकता है ताज़ा फोन करके:

Refresh(); 

हालांकि, ध्यान रखें कि यदि आप निष्पादित Refresh() इसे असाइन किए बिना, तो आप एक अपवाद उत्पन्न कर सकते हैं।

if (Refresh != null) Refresh(); 
else { 
    // Refresh was never assigned 
} 
2

आप सोच सकते प्रतिनिधि एक समारोह प्रकार की तरह है:: जिस तरह से इसे रोकने के लिए अशक्त के विरूद्ध उसकी जांच होगी

  • प्रचार प्रकार, समारोह शून्य रिटर्न और कोई तर्क है:

    दिए गए प्रकार का
    public delegate void NoArguments(); 
    
  • प्रचार चर और इसे प्रारंभ:

    public NoArguments Refresh = null; 
    
  • अपने चर पर नई ऑब्जेक्ट असाइन करें। वस्तु वास्तव में एक समारोह Reset, जो आपके प्रतिनिधि के रूप में एक ही हस्ताक्षर होना आवश्यक है:

    Refresh = new NoArguments(Reset); 
    

अद्यतन:

आप अधिक जानकारी के लिए नीचे दिए गए लिंक की समीक्षा कर सकते हैं: C# Delegates

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