2013-02-27 201 views
6

मूल रूप से शीर्षक क्या कहता है। क्या उन दोनों के बीच अंतर (मैं वर्तमान में पहले एक उपयोग कर रहा हूँ)निजी EventHandler और निजी घटना EventHandler के बीच अंतर?

private EventHandler _progressEvent; 

और

private event EventHandler _progressEvent; 

मैं एक विधि है

void Download(string url, EventHandler progressEvent) { 
    doDownload(url) 
    this._progressEvent = progressEvent; 
} 

doDownload विधि

कहेंगे
_progressEvent(this, new EventArgs()); 

यह अभी तक ठीक काम करता है। लेकिन मुझे लगता है कि मैं कुछ गलत कर रहा हूँ।

उत्तर

8

पहला प्रतिनिधि एक प्रतिनिधि को परिभाषित करता है, दूसरा एक घटना को परिभाषित करता है। दोनों संबंधित हैं, लेकिन वे आमतौर पर बहुत अलग तरीके से उपयोग किया जाता है।

सामान्य रूप से, यदि आप EventHandler या EventHandler<T> का उपयोग कर रहे हैं, तो यह सुझाव देगा कि आप एक ईवेंट का उपयोग कर रहे हैं। कॉलर (प्रगति को संभालने के लिए) आमतौर पर ईवेंट (0 प्रतिनिधि में पास नहीं होने पर) सदस्यता लेंगे, और अगर आपके पास ग्राहक हैं तो आप ईवेंट बढ़ाएंगे।

यदि आप अधिक कार्यात्मक दृष्टिकोण का उपयोग करना चाहते हैं, और एक प्रतिनिधि में पास करना चाहते हैं, तो मैं उपयोग करने के लिए एक और अधिक उपयुक्त प्रतिनिधि चुनूंगा। इस मामले में, आप वास्तव में EventArgs में कोई जानकारी नहीं दे रहे हैं, इसलिए शायद System.Action का उपयोग करना अधिक उपयुक्त होगा।

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

आपका कोड, घटनाओं का उपयोग कर, की संभावना कुछ ऐसा दिखाई देगा:

// This might make more sense as a delegate with progress information - ie: percent done? 
public event EventHandler ProgressChanged; 

public void Download(string url) 
{ 
    // ... No delegate here... 

जब आप अपनी प्रगति को कहते हैं, आप लिखते हैं:

var handler = this.ProgressChanged; 
if (handler != null) 
    handler(this, EventArgs.Empty); 

इस के उपयोगकर्ता इस रूप में लिखते थे:

yourClass.ProgressChanged += myHandler; 
yourClass.Download(url); 
+0

है मैं मैं वास्तव में नहीं है वास्तविक घटनाओं की जरूरत है, क्योंकि मैं केवल 1 ग्राहक होगा लगता है और मैं प्रतिनिधियों के आसपास पारित करने के लिए की जरूरत है। जवाब के लिए धन्यवाद। –

1

मुझे नहीं लगता कि दोनों के बीच एक अंतर है।

ईवेंट कीवर्ड निजी आंतरिक और संरक्षित जैसे एक्सेस संशोधक है। इसका उपयोग मल्टीकास्ट प्रतिनिधियों तक पहुंच प्रतिबंधित करने के लिए किया जाता है।

सबसे अधिक दिखाई से जा रहे हैं कम से कम दिखाई दे करने के लिए हम

public EventHandler _progressEvent; 
//can be assigned to from outside the class (using = and multicast using +=) 
//can be invoked from outside the class 

public event EventHandler _progressEvent; 
//can be bound to from outside the class (using +=) 
//can be invoked from inside the class 

private EventHandler _progressEvent; 
//can be bound from inside the class (using = or +=) 
//can be invoked inside the class 

private event EventHandler _progressEvent; 
//Same as private. given event restricts the use of the delegate from outside 
// the class - i don't see how private is different to private event 

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

  • कोई संबंधित समस्या नहीं^_^