मैंने पढ़ा है कि एक संदर्भ प्रकार में वास्तविक वस्तु का संदर्भ होता है जिसे प्रबंधित ढेर पर संग्रहीत किया जा सकता है। जब किसी विधि को संदर्भ संदर्भ चर के लिए "असाइन किया गया" होता है, तो संदर्भ किस संदर्भ में इंगित करता है? वास्तविक मेमोरी कोड के साथ इस मेमोरी ब्लॉक को क्या करना है?एक प्रतिनिधि क्या इंगित करता है?
उत्तर
को एक सरल उदाहरण के अलावा लेते हैं?
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 विधि लागू करता है। ऑब्जेक्ट पॉइंटर को उस पद्धति पर ट्रैक करता है जिसे लागू करने की आवश्यकता होती है, और लक्ष्य वस्तु जिस पर विधि का आह्वान करना है (जब तक कि विधि स्थैतिक न हो)।
वास्तव में दो प्रतिनिधि प्रकार, Delegate और MulticastDelegate हैं। ये अमूर्त वर्ग हैं जिन्हें delegate
के वास्तविक उदाहरण में विरासत में मिला है। मैं उन वर्गों पर पढ़ने की अनुशंसा करता हूं क्योंकि उनके पास यहां अधिक समझा गया है (सटीक) विवरण है, लेकिन छोटे संस्करण के लिए:
जबकि मैं 100% निश्चित नहीं हूं कि कार्यान्वयन वास्तव में कैसे काम करता है, सबसे आसान तरीका Delegate
ऑब्जेक्ट के बारे में सोचें object
, और MethodInfo
है, जो एक विशेष विधि के लिए प्रतिबिंब प्रकार है। Delegate
प्रकार का कारण सार है, क्योंकि Invoke
विधि विधि के पैरामीटर पर निर्भर करती है।
इसी तरह, MulticastDelegate
पकड़ कई Delegate
वस्तुओं, एक व्यक्ति object
/MethodInfo
संयोजन के लिए जो प्रत्येक बिंदु। यह event
सिस्टम की अनुमति देता है, जहां एक ही event
को कई तरीकों से निकालकर निकाल दिया जा रहा है।
कार्यान्वयन विवरण के लिए वापस जा रहे हैं, जब आप एक प्रतिनिधि को परिभाषित, यह एक Invoke
विधि के साथ MulticastDelegate
से इनहेरिट वर्ग पैदा करता है, यह भी object
स्थिर तरीकों के लिए null
हो सकता है।
इस के शीर्ष पर आपके पास विनिर्देश हैं कि कैसे MulticastDelegate
ऑब्जेक्ट्स के बीच ऑब्जेक्ट पास होते हैं, लेकिन मैंने शायद इस पोस्ट में कुछ गलतियां की हैं, इसलिए मैं इसे छोड़ दूंगा।
एक से अधिक जटिल जवाब देने के बिना, यह बताते हैं वास्तविक स्मृति ब्लॉक जहां विधि संग्रहीत किया जाता है करने के लिए (संदर्भ बनाता है)।
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));
}
}
संकलक क्या करता है:
एक प्रतिनिधि में वास्तव में दो पते होते हैं - विधि के पते के साथ-साथ ऑब्जेक्ट का पता भी। यह काफी रोचक है, और प्रतिनिधियों से संबंधित कई पेटेंट हेलजबर्ग http://www.google.com/patents/US6185728
से सम्मानित किया गया था यह बहुत प्रभावशाली है। interview में, हेल्ज़बर्ग ने इंगित किया कि यह वीटीबीएल प्रेषण से अधिक कुशल हो सकता है (क्योंकि यह किसी फ़ंक्शन के लिए प्रत्यक्ष सूचक है)। सबसे सरल मामलों में यह सचमुच एक अप्रत्यक्ष कॉल है। उदाहरण के लिए
jmp *%eax
कुल मिलाकर, यह 4 instructions to execute a delegate लेता है।
- 1. System.Web.Configuration.MachineKeySection.MetineKeySection.GetDecodedData इंगित करता है
- 2. मैकॉक्स-वर्जन-मिनट क्या इंगित करता है?
- 3. क्या डोमेन नाम एक विशिष्ट फ़ोल्डर को इंगित करता है?
- 4. प्रतिनिधि कैसे काम करता है?
- 5. क्या कोई बेहतर तरीका है? प्रतिनिधि -> प्रतिनिधि -> प्रतिनिधि
- 6. winmd फ़ाइलों के लिए संस्करण 255.255.255.255 क्या इंगित करता है?
- 7. प्रत्येक sc-win32-status code क्या इंगित करता है?
- 8. आईओएस फ़ाइल पथ पर/निजी उपसर्ग क्या इंगित करता है?
- 9. एसबीवाइट प्रक्रिया राज्य फ्रीबीएसडी टॉप में क्या इंगित करता है?
- 10. टाइपपीफ स्ट्रक्चर नोड * NODE क्या इंगित करता है?
- 11. क्या कोई सूचक एलएसबी या एमएसबी को इंगित करता है?
- 12. स्प्रिंग में @ वालिड एनोटेशन क्या इंगित करता है?
- 13. एक प्रतिनिधि उद्देश्य-सी में कैसे काम करता है?
- 14. ऐप प्रतिनिधि xcode प्रोजेक्ट में क्या करता है?
- 15. क्या कोई .NET अपवाद है जो एक अवैध ऑब्जेक्ट स्थिति इंगित करता है?
- 16. एक प्रतिनिधि
- 17. का उपयोग कर करता है एक प्रतिनिधि कचरा
- 18. एक प्रतिनिधि
- 19. एक प्रतिनिधि
- 20. एक प्रतिनिधि
- 21. एक प्रतिनिधि
- 22. आईफोन में प्रतिनिधि क्या है?
- 23. सी ++ में फ़ंक्शन नाम से पहले एक tilde "~" क्या इंगित करता है?
- 24. एक हडोप नौकरी के लिए सीपीयू टाइम क्या इंगित करता है?
- 25. एक प्रतिनिधि
- 26. क्या प्रतिनिधि पैरामीटर के रूप में प्रतिनिधि होना संभव है?
- 27. कोई पाइथन में अमान्य तर्क कैसे इंगित करता है?
- 28. जावास्क्रिप्ट "यह" विंडो ऑब्जेक्ट को फिर से इंगित करता है
- 29. प्रतिनिधि और प्रतिनिधि तरीके क्या हैं
- 30. पाइथन में बंद() को फ्लश() को इंगित करता है?
बिल्कुल सही उत्तर नहीं जिसे आप ढूंढ रहे हैं लेकिन यह पोस्ट प्रतिनिधियों पर कुछ अंतर्दृष्टि प्रदान कर सकता है http://stackoverflow.com/questions/527489/how-delegates-work-in-the-background –