2008-09-17 21 views
29

कहो मैं एक वर्ग मेंढक नामित करने के लिए एक घटना को जोड़ने के लिए, की तरह यह लग रहा है:कैसे एक वर्ग

public class Frog 
{ 
    public int Location { get; set; } 
    public int JumpCount { get; set; } 


    public void OnJump() 
    { 
     JumpCount++; 
    } 

} 

मैं 2 बातें साथ मदद की जरूरत:

  1. मैं नामक एक ईवेंट बनाना चाहते कक्षा परिभाषा में कूदो।
  2. मैं मेंढक वर्ग का एक उदाहरण बनाना चाहता हूं, और फिर एक और विधि बनाएं जिसे मेंढक कूदने पर बुलाया जाएगा।

उत्तर

47
public event EventHandler Jump; 
public void OnJump() 
{ 
    EventHandler handler = Jump; 
    if (null != handler) handler(this, EventArgs.Empty); 
} 

तो

Frog frog = new Frog(); 
frog.Jump += new EventHandler(yourMethod); 

private void yourMethod(object s, EventArgs e) 
{ 
    Console.WriteLine("Frog has Jumped!"); 
} 
+1

धन्यवाद, हालांकि मुझे इस पंक्ति की आवश्यकता नहीं दिखाई देती है "EventHandler हैंडलर = जंप;" –

+7

यह मृत हैंडलर से बचने के लिए है .. सी # में जब आप जांचते हैं कि एक हैंडलर शून्य है और हैंडलर को आमंत्रित करने का वास्तविक समय विधि को हटा दिया जा सकता था। तो आप एक संदर्भ स्थापित करते हैं जहां हैंडलर वर्तमान में इंगित कर रहा है, फिर उस संदर्भ पर नल की जांच करें और आह्वान करें। –

+0

क्या पहला कोड स्निपेट एक स्थिर वैश्विक दायरा चीज़ होगा? अन्यथा यह कैसे पता चलता है कि मेंढक। जंप करता है? – WDUK

0

@CQ: क्यों आप Jump पीएफ स्थानीय प्रतिलिपि बना सकता हूँ? इसके अतिरिक्त, आप घटना के घोषणापत्र को थोड़ा बदलकर बाद के परीक्षण को बचा सकते हैं:

public event EventHandler Jump = delegate { }; 

public void OnJump() 
{ 
    Jump(this, EventArgs.Empty); 
} 
+2

स्थानीय प्रतिलिपि बनाना एक रक्षात्मक तकनीक है जो अगर इसे चलाने का मौका मिलने से पहले हैंडलर हटा दिया जाता है तो ओकुरिंग से छोड़कर एक को रोकता है। –

+4

इसके अलावा, यदि आप शून्य की जांच नहीं करते हैं, तो यदि आप जंप (यह, EventArgs.Empty) को कॉल करते समय ईवेंट से जुड़े ईवेंट हैंडलर नहीं हैं तो आपको NullReferenceException मिलेगा; –

+1

स्कॉट, आप यहां एक संदर्भ निर्दिष्ट कर रहे हैं इसलिए यह "रक्षात्मक तकनीक" पूरी तरह से बेकार है। –