2012-02-25 13 views
11

मैंने पढ़ा है कि एक संदर्भ प्रकार में वास्तविक वस्तु का संदर्भ होता है जिसे प्रबंधित ढेर पर संग्रहीत किया जा सकता है। जब किसी विधि को संदर्भ संदर्भ चर के लिए "असाइन किया गया" होता है, तो संदर्भ किस संदर्भ में इंगित करता है? वास्तविक मेमोरी कोड के साथ इस मेमोरी ब्लॉक को क्या करना है?एक प्रतिनिधि क्या इंगित करता है?

+0

बिल्कुल सही उत्तर नहीं जिसे आप ढूंढ रहे हैं लेकिन यह पोस्ट प्रतिनिधियों पर कुछ अंतर्दृष्टि प्रदान कर सकता है http://stackoverflow.com/questions/527489/how-delegates-work-in-the-background –

उत्तर

14

को एक सरल उदाहरण के अलावा लेते हैं?

delegate bool MyFilter(int x); 

संकलक एक प्रकार है कि इस तरह कुछ हद तक लग रहा है उत्पन्न करता है: चलो इस लाइन के साथ शुरू करते हैं

class MyFilter : MulticastDelegate 
{ 
    public MyFilter(Object thisRef, IntPtr method); 
    public bool Invoke(int x); 
    // BeginInvoke(), EndInvoke() - Let's ignore those 
}  

प्रकार MyFilter एक निर्माता है कि दो पैरामीटर स्वीकार करता है: विधि शरीर के लिए एक IntPtr आह्वान करने के लिए, और एक वस्तु जिस पर इस विधि को बुलाया जाना चाहिए। MyFilter प्रकार पर Invoke() विधि वास्तविक प्रतिनिधि को आमंत्रित करती है।

अब, देखते हैं कि मुख्य() विधि में क्या होता है। संकलक इस तरह कुछ हद तक यह फिर से लिखने होगा:

static void Main() 
    { 
     MyFilter f = new MyFilter(new Program(), addressof(Program.IsOdd)); 
     Console.WriteLine(f.Invoke(5)); 
    } 
बेशक

, addressof एक वास्तविक सी # ऑपरेटर नहीं है, लेकिन आप कल्पना कर सकते हैं कि यह विधि पारित कर दिया-इन के लिए शरीर के पते देता है। इसके अलावा, मैं (कि MulticastDelegate आधार वर्ग द्वारा प्रदान की एक सुविधा है) इस तरह के चेनिंग के रूप में प्रतिनिधियों से संबंधित विभिन्न अन्य विषयों पर चर्चा नहीं था, लेकिन उम्मीद है कि मैं अपने प्रश्न को सुलझा लिया है।

संक्षेप में, प्रतिनिधि संदर्भ उस ऑब्जेक्ट को इंगित करता है जो प्रतिनिधि के हस्ताक्षर से मेल खाता एक Invoke विधि लागू करता है। ऑब्जेक्ट पॉइंटर को उस पद्धति पर ट्रैक करता है जिसे लागू करने की आवश्यकता होती है, और लक्ष्य वस्तु जिस पर विधि का आह्वान करना है (जब तक कि विधि स्थैतिक न हो)।

0

वास्तव में दो प्रतिनिधि प्रकार, Delegate और MulticastDelegate हैं। ये अमूर्त वर्ग हैं जिन्हें delegate के वास्तविक उदाहरण में विरासत में मिला है। मैं उन वर्गों पर पढ़ने की अनुशंसा करता हूं क्योंकि उनके पास यहां अधिक समझा गया है (सटीक) विवरण है, लेकिन छोटे संस्करण के लिए:

जबकि मैं 100% निश्चित नहीं हूं कि कार्यान्वयन वास्तव में कैसे काम करता है, सबसे आसान तरीका Delegate ऑब्जेक्ट के बारे में सोचें object, और MethodInfo है, जो एक विशेष विधि के लिए प्रतिबिंब प्रकार है। Delegate प्रकार का कारण सार है, क्योंकि Invoke विधि विधि के पैरामीटर पर निर्भर करती है।

इसी तरह, MulticastDelegate पकड़ कई Delegate वस्तुओं, एक व्यक्ति object/MethodInfo संयोजन के लिए जो प्रत्येक बिंदु। यह event सिस्टम की अनुमति देता है, जहां एक ही event को कई तरीकों से निकालकर निकाल दिया जा रहा है।

कार्यान्वयन विवरण के लिए वापस जा रहे हैं, जब आप एक प्रतिनिधि को परिभाषित, यह एक Invoke विधि के साथ MulticastDelegate से इनहेरिट वर्ग पैदा करता है, यह भी object स्थिर तरीकों के लिए null हो सकता है।

इस के शीर्ष पर आपके पास विनिर्देश हैं कि कैसे MulticastDelegate ऑब्जेक्ट्स के बीच ऑब्जेक्ट पास होते हैं, लेकिन मैंने शायद इस पोस्ट में कुछ गलतियां की हैं, इसलिए मैं इसे छोड़ दूंगा।

0

एक से अधिक जटिल जवाब देने के बिना, यह बताते हैं वास्तविक स्मृति ब्लॉक जहां विधि संग्रहीत किया जाता है करने के लिए (संदर्भ बनाता है)।

using System; 
class Program 
{ 
    delegate bool MyFilter(int x); 

    bool IsOdd(int x) 
    { 
     return x % 2 == 1; 
    } 

    static void Main() 
    { 
     MyFilter f = new Program().IsOdd; 
     Console.WriteLine(f(5)); 
    } 
} 

संकलक क्या करता है:

0

एक प्रतिनिधि में वास्तव में दो पते होते हैं - विधि के पते के साथ-साथ ऑब्जेक्ट का पता भी। यह काफी रोचक है, और प्रतिनिधियों से संबंधित कई पेटेंट हेलजबर्ग http://www.google.com/patents/US6185728

से सम्मानित किया गया था यह बहुत प्रभावशाली है। interview में, हेल्ज़बर्ग ने इंगित किया कि यह वीटीबीएल प्रेषण से अधिक कुशल हो सकता है (क्योंकि यह किसी फ़ंक्शन के लिए प्रत्यक्ष सूचक है)। सबसे सरल मामलों में यह सचमुच एक अप्रत्यक्ष कॉल है। उदाहरण के लिए

jmp *%eax 

कुल मिलाकर, यह 4 instructions to execute a delegate लेता है।

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