2009-11-17 15 views
6

क्या प्रतिनिधियों के संदर्भ में कॉलबैक शब्द का अर्थ है, "प्रतिनिधिमंडल एक प्रतिनिधि जो कुछ कार्य" समाप्त करने के लिए किसी अन्य प्रतिनिधि के लिए काम करता है "?प्रतिनिधियों और कॉलबैक

उदाहरण :(मेरी समझ के आधार पर, मैं एक कॉलबैक लागू कर दिया है,) मेरे को सही अगर यह गलत है

namespace Test 
{ 
    public delegate string CallbackDemo(string str); 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      CallbackDemo handler = new CallbackDemo(StrAnother); 
      string substr = Strfunc(handler); 
      Console.WriteLine(substr); 
      Console.ReadKey(true); 
     } 

     static string Strfunc(CallbackDemo callback) 
     { 
      return callback("Hello World"); 
     } 

     static string StrAnother(string str) 
     { 
      return str.Substring(1, 3).ToString(); 
     } 
    } 
} 

आवश्यक के रूप में उदाहरण प्रदान करें।

+1

एक प्रकार के रूप में एक प्रतिनिधि के रूप में एक प्रतिनिधि के बारे में सोचने के लिए मूल्यवान है: एक इंटरफ़ेस या कक्षा की तरह: यह एक उदाहरण के लिए एक टेम्पलेट है जो स्वयं अपने आंतरिक तरीके का संदर्भ है: उदाहरण पारित किया जा सकता है वस्तुओं के बीच और किसी भी समय आमंत्रित/निष्पादित। यदि आपके पास जॉन स्कीट द्वारा "गहराई में सी #" पकड़ने का कोई तरीका है, और डेलीगेट्स पर अध्याय 2 अनुभाग और डेलीगेट्स पर अध्याय 5 पढ़ा है, तो आप प्रतिनिधियों के "विकास" को उनके "लार्वा" से समझेंगे चरण "सी # 1.0 में, सी # 3.0 में उनके पूर्ण" विकसित "रूप में। मुझे कभी भी बेहतर प्रदर्शन नहीं मिला है – BillW

उत्तर

11

आपका उदाहरण एक अच्छी शुरुआत है, लेकिन यह गलत है। आप विधि में एक नया प्रतिनिधि नहीं बनाते हैं, इसका उपयोग कक्षा में किसी ईवेंट की घोषणा में किया जाता है। अपने कोड का यह संशोधित उदाहरण देखें:

namespace Test 
{ 
    //In this case, this delegate declaration is like specifying a specific kind of function that must be used with events. 
    public delegate string CallbackDemo(string str); 
    class Program 
    { 
     public static event CallbackDemo OnFoobared; 
     static void Main(string[] args) 
     { 
      //this means that StrAnother is "subscribing" to the event, in other words it gets called when the event is fired 
      OnFoobared += StrAnother; 
      string substr = Strfunc(); 
      Console.WriteLine(substr); 
      Console.ReadKey(true); 
      //this is the other use of delegates, in this case they are being used as an "anonymous function". 
      //This one takes no parameters and returns void, and it's equivalent to the function declaration 
      //'void myMethod() { Console.WriteLine("another use of a delegate"); }' 
      Action myCode = delegate 
      { 
       Console.WriteLine("another use of a delegate"); 
      }; 
      myCode(); 
      Console.ReadKey(true); 
      //the previous 4 lines are equivalent to the following however this is generally what you should use if you can 
      //its called a lambda expression but it's basically a way to toss arbitrary code around 
      //read more at http://www.developer.com/net/csharp/article.php/3598381/The-New-Lambda-Expressions-Feature-in-C-30.htm or 
      //http://stackoverflow.com/questions/167343/c-lambda-expression-why-should-i-use-this 
      Action myCode2 =() => Console.WriteLine("a lambda expression"); 
      myCode2(); 
      Console.ReadKey(true); 
     } 

     static string Strfunc() 
     { 
      return OnFoobared("a use of a delegate (with an event)"); 
     } 
     static string StrAnother(string str) 
     { 
      return str.Substring(1, 3).ToString(); 
     } 
    } 
} 

मैंने केवल सतह को खरोंच कर लिया है; बहुत अधिक के लिए "प्रतिनिधि सी #" और "लैम्ब्डा अभिव्यक्ति सी #" के लिए खोज स्टैक ओवरफ़्लो!

+0

आपको बहुत धन्यवाद – user160677

+0

आपका स्वागत है! – RCIX

3

एक कॉलबैक मूल रूप से एक प्रक्रिया में पारित एक प्रतिनिधि है जो कि प्रक्रिया कुछ उचित बिंदु पर "वापस कॉल" करेगी। उदाहरण के लिए, WebRequest.BeginGetResponse या WCF BeginXxx ऑपरेशन जैसे एसिंक्रोनस कॉल में, आप एक AsyncCallback पास करेंगे। कार्यकर्ता AsyncCallback के रूप में जो कुछ भी आप पास करते हैं, उसे "वापस कॉल करें", इस मामले में जब यह आपको यह बताने के लिए समाप्त हो गया है कि यह समाप्त हो गया है और परिणाम प्राप्त करने के लिए।

एक ईवेंट हैंडलर को एक और उदाहरण माना जा सकता है। उदाहरण के लिए, जब आप किसी क्लिक ईवेंट में हैंडलर संलग्न करते हैं, तो क्लिक होने पर बटन उस हैंडलर को "वापस कॉल" करेगा।

3

कॉलबैक वह होता है जब प्रतिनिधि इसे लागू करते समय निष्पादित करता है। कोड है कि प्रतिनिधि लागू द्वारा निष्पादित किया जाता है

public static void Main(string[] args) 
{ 
    Socket s = new Socket(...); 

    byte[] buffer = new byte[10]; 
    s.BeginReceive(buffer, 0, 10, SocketFlags.None, new AsyncCallback(OnMessageReceived), buffer); 

    Console.ReadKey(); 
} 

public static void OnMessageReceived(IAsyncResult result) 
{ 
    // ... 
} 

OnMessageReceived कॉलबैक है, उदाहरण के लिए, जब अतुल्यकालिक पैटर्न प्रतिनिधियों का उपयोग कर का उपयोग कर, आप कुछ इस तरह करना होगा। कुछ और जानकारी के लिए this Wikipedia article देखें, या Google कुछ और उदाहरण देखें।

1

यह सही कारण के कारण ठीक से नीचे आ जाएगा। सी # प्रतिनिधियों को लागू नहीं करता है, यह क्या लागू करता है कॉल अग्रेषण है। नामकरण का यह गलत उपयोग शायद इस संबंध में सी # के साथ सबसे बड़ी समस्या है।

नीचे एसीएम पेपर बाद में एक प्रतिनिधि कहलाता है जिसका पहला विवरण है। असल में एक प्रतिनिधि ऐसा कुछ होता है जो किसी ऑब्जेक्ट का उदाहरण होता है (वास्तव में इसे कैसे लागू किया जाता है) अप्रासंगिक है। इसका मतलब है कि आप प्रतिनिधि से विधियों, एक्सेस गुणों आदि को कॉल कर सकते हैं।

http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html

क्या सी # औजार कॉलबैक या कॉल-अग्रेषण (आप उनका उपयोग कैसे पर सभी निर्भर) है। ये प्रतिनिधि नहीं हैं। एक प्रतिनिधि बनने के लिए ऑब्जेक्ट तक पहुंचने में सक्षम होना चाहिए जैसे कि यह ऑब्जेक्ट स्वयं ही था।

जब एक पेन प्रोटोटाइपिकल पेन में ड्रॉ संदेश भेजता है, तो यह कह रहा है "मुझे नहीं पता कि ड्रॉ संदेश को कैसे संभालना है। मैं चाहता हूं कि आप मेरे लिए इसका उत्तर दें यदि आप कर सकते हैं, लेकिन यदि आपके कोई और प्रश्न हैं, जैसे कि मेरे एक्स चर के मूल्य क्या हैं, या कुछ भी करने की ज़रूरत है, तो आपको मेरे पास वापस आना चाहिए और पूछना चाहिए। "अगर संदेश आगे दिया गया है, चर के मूल्यों के बारे में सभी प्रश्न या संदेशों के जवाब देने के अनुरोध सभी ऑब्जेक्ट से अनुमानित हैं जो संदेश को पहले स्थान पर पहुंचाते हैं।- हेनरी लाइबरमैन

तो, यह कैसे गड़बड़ हो गया? ईमानदार होने के लिए, मुझे नहीं पता। मुझे पता है कि मैं सी # से पहले प्रतिनिधियों (16 साल से अधिक) का उपयोग कर रहा हूं और सी # उपकरण क्या प्रतिनिधि नहीं हैं।

यहां वास्तव में एक अच्छा स्पष्टीकरण हो सकता है।

http://www.saturnflyer.com/blog/jim/2012/07/06/the-gang-of-four-is-wrong-and-you-dont-understand-delegation/

रियल प्रतिनिधिमंडल कॉलबैक बनाने या अग्रेषण फोन से अधिक है। एक असली प्रतिनिधि मुझे उस वस्तु पर किसी भी विधि को कॉल करने, सार्वजनिक संपत्तियों को प्राप्त करने और/या सेट करने की इजाजत देता है - जैसे कि यह वस्तु ही थी। सी # "प्रतिनिधिमंडल" की तुलना में यह कहीं अधिक शक्तिशाली और वास्तव में उपयोग करना आसान है।

ओपी पूछा:

प्रतिनिधियों के संदर्भ में अवधि कॉलबैक, "एक प्रतिनिधि सौंपकर यह एक और प्रतिनिधि के लिए काम करता है inorder कुछ काम खत्म करने के लिए" मतलब है?

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

प्रतिनिधिमंडल क्यों दूषित हो गया, मुझे नहीं पता। मैं सही प्रतिनिधिमंडल को लागू करने के लिए तत्पर हूं।

+0

नीचे मतदान किया क्योंकि ...? –

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