2010-05-11 5 views
12

पिछले कुछ दिनों में मैंने HERE और HERE प्रतिनिधियों के बारे में कुछ प्रश्न पूछे। मैं स्वीकार करता हूं ... मैं वास्तव में प्रतिनिधियों को समझ नहीं पा रहा हूं। और मैं वास्तव में वास्तव में उन्हें समझना और उन्हें महारत हासिल करना चाहता हूं। (मैं उन्हें परिभाषित कर सकता हूं - सुरक्षित फ़ंक्शन पॉइंटर्स टाइप करें - लेकिन चूंकि मुझे सी प्रकार की भाषाओं के साथ थोड़ा सा अनुभव नहीं है, यह वास्तव में सहायक नहीं है।).NET प्रतिनिधियों, घटनाओं, और घटनाओं को समझने में सहायता

क्या कोई भी कुछ ऑनलाइन संसाधनों की अनुशंसा कर सकता है जो प्रतिनिधियों को एक तरह से समझाएंगे क्या कुछ नहीं लगता है?

यह उन क्षणों में से एक है जहां मुझे संदेह है कि वीबी वास्तव में मुझे विकलांग करता है क्योंकि यह दृश्यों के पीछे मेरे लिए कुछ तारों को करता है।

आदर्श संसाधन सिर्फ यह बताएगा कि कौन से प्रतिनिधि हैं, किसी भी अन्य घटनाओं (घटनाओं और घटनाक्रमों) के संदर्भ में, मुझे दिखाएगा कि सब कुछ कैसे वायर्ड हो गया है, समझाएं (जैसा कि मैंने अभी सीखा है) कि प्रतिनिधि प्रकार हैं और क्या बनाता है उन्हें एक प्रकार के रूप में अद्वितीय (शायद थोड़ा हल्का जादू का उपयोग करना))। उस नींव के बाद यह विस्तार करने के लिए विस्तार किया जाएगा कि प्रतिनिधि कैसे घटनाओं और घटनाक्रमों से संबंधित हैं, जिन्हें अपने अधिकार में एक बहुत अच्छी व्याख्या की आवश्यकता होगी। आखिरकार यह संसाधन वास्तविक उदाहरणों का उपयोग करके इसे एक साथ जोड़ सकता है और समझा सकता है कि कंपाइलर द्वारा वायरिंग स्वचालित रूप से क्या होता है, उनका उपयोग कैसे करें, आदि। और, हाँ, जब आपको प्रतिनिधियों का उपयोग करना चाहिए और अन्य शब्दों में, डाउनसाइड्स और विकल्प प्रतिनिधियों का उपयोग करने के लिए।

आप क्या कहते हैं? क्या आप में से कोई मुझे संसाधनों के लिए इंगित कर सकता है जो मेरी निपुणता की यात्रा शुरू करने में मेरी मदद कर सकता है?

EDIT एक आखिरी बात। आदर्श संसाधन समझाएगा कि इंटरफ़ेस घोषणा में आप प्रतिनिधियों का उपयोग कैसे कर सकते हैं और नहीं कर सकते हैं। यह ऐसा कुछ है जो वास्तव में मुझे ऊपर चला गया।

आपकी मदद के लिए धन्यवाद।

सेठ

+0

घटनाओं और घटनाओं से प्रतिनिधियों को स्पष्टीकरण में अलग करना बहुत मुश्किल है क्योंकि प्रतिनिधियों को उन सुविधाओं को संभव बनाने के लिए बड़े पैमाने पर बनाया गया था। इस प्रकार, प्रतिनिधियों और घटनाओं को अक्सर ज्यादातर लोगों द्वारा एक साथ सोचा जाता है, खासतौर पर वे जो उन्हें समझाने की कोशिश कर रहे हैं। –

+1

संभावित डुप्लिकेट [प्रतिनिधियों को समझने की कोशिश क्यों ब्रह्मांड की प्रकृति को समझने की कोशिश कर रही है?] (Http://stackoverflow.com/questions/2678632/why-does-trying-to-understand-delegates-feel- प्रकृति-समझने-समझने की प्रकृति) –

+0

@ सेठ - हैलो सेठ, मैं बिल्कुल आपकी स्थिति में हूं। और मैं किसी भी तरह से खुद को बेवकूफ मानने के लिए नहीं मानता। मैंने क्रिस सेल के स्पष्टीकरण को पढ़ा है (समझ में नहीं आया), पाठ्यपुस्तक में एक स्पष्टीकरण पढ़ा है (मुझे यह पता है कि यह क्या है, लेकिन इसका उपयोग करने के लिए केवल एक अस्पष्ट धारणा है), स्टैक ओवरफ़्लो उत्तर पढ़ चुके हैं: मैं अभी भी नहीं करता इसका कब समझना है कि इसका उपयोग कब/क्यों किया जाता है: क्या आप कभी इसके नीचे पहुंच गए थे? यदि ऐसा है तो कृपया अपनी व्याख्या के साथ सभी की मदद करें? – BKSpurgeon

उत्तर

6

मेरा पसंदीदा स्पष्टीकरण क्रिस सेल्स से आता है:

http://sellsbrothers.com/public/writing/delegates.htm

+0

मैं अपना खुद का डाल रहा था लेकिन यह बहुत बेहतर है। ++ – Ryan

+0

यह लिंक अब मृत प्रतीत होता है ... – Ken

+0

मैंने लिंक अपडेट किया है। –

0

सी # प्रोग्रामिंग गाइड पर एक नजर डालें - here प्रतिनिधियों खंड है।

12

सरल व्याख्या है कि एक प्रतिनिधियों आप गतिशील रूप से एक चर के लिए एक विधि का "नाम" आवंटित या इसके आसपास से गुजरने की अनुमति है एक पैरामीटर के रूप में (आप स्ट्रिंग नाम असाइन नहीं कर रहे हैं, यह उस विधि का संदर्भ है जिसे आप चर को असाइन कर रहे हैं)।

अन्य कोड वैरिएबल में देख सकते हैं, और बाद में संग्रहीत विधि का आह्वान कर सकते हैं।

प्रतिनिधि को एक परिभाषा (एक इंटरफ़ेस की तरह) होना चाहिए, और इसके लिए आप प्रतिनिधि कीवर्ड का उपयोग करें।

public delegate bool NotifyFriendsDelegate(int intensity); 

यह मूलतः सिर्फ का कहना है कि किसी भी विधि (कहीं भी) कि एक बूलियन देता है, और प्रकार int की एक एकल पैरामीटर लेता है इस प्रतिनिधि का एक उदाहरण है: हम एक प्रतिनिधि परिभाषा कहीं है कि इस तरह दिखता है कहो।इसलिए प्रतिनिधि परिभाषा एक आकार, या हस्ताक्षर निर्दिष्ट करती है, कि विधियों से मेल खाना चाहिए।

तो कहते हैं कि हम इस तरह एक वर्ग है:

public class MyCar 
{ 

    public bool GoVisitMyFriends(NotifyFriendsDelegate thingToDoWhenWeGetThere) 
    { 
     var doOurFriendsLikeUs = false; 
     var driving = new DrivingClass(); 
     var didWeGetThere = driving.DoTheDrivingNowPlease(); 

     if(didWeGetThere) 
     { 
       doOurFriendsLikeUs = thingToDoWhenWeGetThere(11); 
     } 
     return doOurFriendsLikeUs; 
    } 
} 

इस वर्ग के एक काल्पनिक कार का प्रतिनिधित्व करता है, और यह एक सरल विधि है कि हमारे दोस्त के घर के लिए ड्राइव करने के लिए कार का कारण बनता है है। अगर कार हमारे दोस्तों के घर जाती है, तो हम अपने दोस्तों को सूचित करना चाहते हैं कि हम पहुंचे ... लेकिन कार वर्ग को पता नहीं है कि हमारे दोस्तों को कैसे सूचित किया जाए। हम वास्तव में जोर से स्टीरियो खेल सकते हैं, हम सींग को उड़ा सकते हैं, या हम एक बुलहॉर्न का उपयोग कर सकते हैं।

चूंकि GoVisitMyFriends विधि को हमारे मित्रों को बिल्कुल सूचित करने के बारे में नहीं पता है, इसके बजाय यह आवश्यक है कि कॉलिंग कोड कुछ विधि के संदर्भ में पास हो जो अधिसूचना भाग कर सके। GoVisitMyFriends इस बात की परवाह नहीं करते कि आप कौन सी विधि देते हैं, जब तक विधि को NotifyFriendsDelegate की परिभाषा की तरह आकार दिया जाता है (इसे बूलियन लौटना होगा और टाइप int के एक पैरामीटर को स्वीकार करना होगा)।

public class MyFunClass() 
{ 
    public bool NotifyFriendsByRammingTheirHouse(int howHard) 
    { 
     var rammingModule = new RammingModule(); 
     return rammingModule.RamFriendsHouse(howHard); 
    } 

    public bool DoSomethingFun() 
    { 
     var car = new MyCar(); 
     var areWeCool = car.GoVisitMyFriends(NotifyFriendsByRammingTheirHouse); 
     return areWeCool; 
    } 
} 

इस वर्ग के लिए एक विधि है कि NotifyFriendsDelegate के हस्ताक्षर के अनुरूप होते हैं:

अब एक साधारण वर्ग हमारे काल्पनिक कार का उपयोग करता है बना सकते हैं। इसमें DoSomethingFun नामक एक विधि शामिल है, जो MyCar का एक उदाहरण बनाता है, फिर GoVisitMyFriends विधि को आमंत्रित करता है। और यह NotifyFriendsByRammingTheirHouse विधि में गुजरता है ताकि माईकर कक्षा को पता चले कि हम वहां पहुंचने पर अपने दोस्तों के लिए अपना प्यार कैसे दिखाना चाहते हैं।

और यह प्रतिनिधि उपयोग का सबसे सरल रूप है जिसे मैं सोच सकता हूं।

बीटीडब्लू: मुझे हमेशा घटनाओं के बारे में सोचने के लिए उपयोगी लगता है क्योंकि विशेष चर के रूप में प्रतिनिधि विधियों का संग्रह होता है। इस कार्यक्रम को प्रतिनिधियों के किसी भी नंबर (अनंत तक शून्य) असाइन किया जा सकता है, जिसमें से सभी को ईवेंट लागू होने पर बुलाया जाएगा। घटनाएं केवल प्रतिनिधियों के समूह हैं जिन्हें "एक चीज़" के रूप में माना जा सकता है।

+0

मुझे इस उद्धरण से नफरत है: "यह मूल रूप से केवल इतना कहता है कि कोई भी विधि (कहीं भी) जो एक बुलियन लौटाता है, और इस प्रकार के एक प्रकार का एक पैरामीटर लेता है, इस प्रतिनिधि का एक उदाहरण है"। लेकिन मैं तुम्हें दोष नहीं दे सकता। विषय को समझाना मुश्किल है। मैं कोशिश करने की हिम्मत भी नहीं करता हूं। मेरी राय में बेहतर समानता अज्ञात कार्य एक शाब्दिक की तरह है, सामान्य कार्य एक नामित स्थिर की तरह है और एक प्रतिनिधि चर अच्छी तरह से है ... एक चर। –

+0

हे, मुझे पता है तुम्हारा क्या मतलब है। यदि आप तकनीकी कार्यान्वयन में खोदते हैं तो मेरे उत्तर में लगभग कुछ भी "सत्य" या "सटीक" नहीं है। लेकिन मुझे पता चला है कि प्रतिनिधियों के बारे में सोचने का यह सामान्य तरीका अग्रणी डेवलपर्स में बहुत अच्छा है कि प्रतिनिधियों के बारे में एक उपयोगी समझ है। वहां से, एक और सटीक तस्वीर विकसित हो सकती है ... लेकिन अस्पष्ट सामान्यीकृत विचार प्राप्त करना कठिन हिस्सा है। –

+0

दरअसल घटनाएं प्रतिनिधियों के संग्रह के आसपास एक रैपर हैं। एकमात्र मामला जहां मल्टीकास्ट प्रतिनिधियों उपयोगी आईएमओ हैं। – nawfal