2012-02-16 22 views
22

यह जानकारी वर्ग घटना लागू करने के लिए वापस गुजर के प्रयोजन के लिए ईवेंट हैंडलर्स में EventArgs को संशोधित करने पर सिकोड़ी है लागू करने के लिए वापस पारित करने के लिए?EventArgs का उपयोग करते हुए जानकारी वर्ग

उदाहरण के लिए यदि मेरे पास एसएसएल के लिए प्रमाणपत्र प्रमाणित करने के लिए निम्न स्तर की संचार कक्षा है, लेकिन यह जानने का कोई तरीका नहीं है कि वैध प्रमाणपत्र कैसा दिखता है क्योंकि यह कक्षा के विभिन्न उपयोगकर्ताओं का ज्ञान है।

class ValidationEventArgs : System.EventArgs 
{ 
    public X509Certificate Certificate { get; set; } 
    public bool Valid { get; set; } 
} 

तो वस्तुओं का उपयोग करने में वे घटना के लिए ऊपर हुक, और अगर प्रमाण पत्र स्वीकार्य है या नहीं यह देखने के किसी भी तरह Valid झंडा बदल रहा है इंगित करने के लिए।

comms.ValidationEvent += CertValidationHandler; 

void CertValidationHandler(ValidationEventArgs args) 
{ 
    if (args.Certificate.Issuer.Contains(COMPANY_NAME) 
     args.Valid = true; 
} 

मैं पाया है EventArgs की references इस तरह इस्तेमाल किया जा रहा लेकिन मैं यह भी कह रही है यह अनुशंसित नहीं है लोगों को देखा है।

संपादित करें: शायद मुझे यह स्पष्ट करना चाहिए कि यह EventArgs को विरासत में लाने के बारे में नहीं है, बल्कि संचार के द्वि-दिशात्मक चैनल के रूप में उनका उपयोग कर रहा है। जैसा कि अन्य ने टिप्पणी की है यह स्वीकार्य है और जो भी शोर विपरीत है, वह शायद अवधारणा को गलत समझा/दुरुपयोग कर रहा है और अब goto के खिलाफ एक ही व्यक्तिगत क्रूसेड है।

+6

कौन कहता है कि यह अनुशंसित नहीं है:

if(SizeRectChanged != null){ Rect r = new Rect(0,0,0,0); SizeRectChanged(this,r); } 

घटना सुनकर? यह ढांचे में हर समय होता है। ['CancelEventArgs'] देखें (http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs।aspx); यह उससे ज्यादा बुनियादी नहीं मिलता है। –

+0

चारों ओर घूमते हुए मुझे यह महसूस हो गया कि म्यूटेबल इवेंट आर्ट्स वास्तव में कुछ नहीं करना चाहिए, शायद इसलिए कि किसी ने किसी बिंदु पर इसका दुरुपयोग किया है। धन्यवाद –

+0

चीजों की तरह, इसका उपयोग करने के लिए समय और स्थान हो सकता है, गलत तरीके से और जगह में इसका उपयोग करना बुरा है, लेकिन इससे यह स्वयं खराब नहीं होता है। – MikeT

उत्तर

41

खुद निम्नलिखित प्रश्न पूछो, "जब मैं एक घटना प्रकाशित करते हैं, मैं किसी भी ग्राहक EventArgs से कोई भी मान को बदलने के लिए चाहते हैं"? अगर उत्तर नहीं है, उदा। आप केवल पढ़ने की जानकारी प्रसारित कर रहे हैं, फिर कक्षा को अपरिवर्तनीय बनाते हैं, हालांकि यदि आपको किसी ग्राहक से कुछ प्रतिक्रिया की आवश्यकता है तो उन गुणों को बनाएं जिन्हें परिवर्तनीय रूप से बदला जाना चाहिए।

स्पष्ट करने के लिए एक प्रसारण उदाहरण के लिए, हम किसी भी ग्राहक कुछ बताना चाहता हूँ, लेकिन न जाने उन्हें मूल्य में परिवर्तन।

public class ProgressEventArgs : EventArgs 
{ 
    public ProgressEventArgs(int current) 
    { 
     this.Current = current; 
    } 

    public int Current { get; private set; } 
} 

समान रूप से, हम कक्षा के बारे में जानकारी के बारे में पूछने के लिए एक ईवेंट भी उठा सकते हैं।

public class FeedbackEventArgs : EventArgs 
{ 
    public bool ShouldContinue { get; set; } 
    public string Reason { get; set; } 
} 
+0

के लिए अनुमति नहीं देता है, मुझे यह पसंद आया, यह स्वयं से पूछने के लिए सही प्रश्न दिखाता है। –

+2

मुझे पता है कि यह पुराना है, लेकिन मैं यह इंगित करना चाहता हूं कि इस दृष्टिकोण का उपयोग करते समय सावधान रहना चाहिए क्योंकि प्रति ईवेंट एक से अधिक ग्राहक हो सकते हैं, लेकिन यह एक ही घटना वस्तु हो सकती है ताकि सरल सेटर्स का उपयोग किया जा सके परिणामस्वरूप ओवरराइट किया जा रहा है। – Pharap

+0

@ भरप अच्छा बिंदु! उत्परिवर्तनीय उदाहरण में, यह "आखिरी लेखन जीत" का मामला होगा –

2

मैं EventArgs से इनहेरिट के खिलाफ किसी भी सिफारिश के बारे में पता नहीं कर रहा हूँ; जहां तक ​​मुझे पता है, इससे विरासत में अच्छा अभ्यास है।

एक सामान्य सिद्धांत रूप में, मैं सुझाव है कि आप अपने व्युत्पन्न वर्ग अपरिवर्तनीय हैं। इससे आपको धागे के बीच गुजरने के लिए अधिक सुरक्षित बना दिया जाना चाहिए। ऐसा करने का सबसे आसान तरीका है अपनी गुणों को { get; private set; } के रूप में घोषित करना, और केवल उन्हें निर्माता में सेट करना। जाहिर है आप उस प्रश्न में आपके विशिष्ट उपयोग मामले के साथ ऐसा नहीं कर सकते हैं, लेकिन आपको जहां संभव हो वहां करना चाहिए।

+0

+1 - सहमत हुए। इस विधि को कई बार इस्तेमाल किया जाता है। – ChrisBD

+0

हां, मैंने उदाहरण को अधिक बढ़ाया, केवल म्यूटेबल पैरामीटर बुलियन होगा। सवाल आवेदक को वापस डेटा पास करने के लिए घटनाओं का उपयोग कर रहा था, मूल रूप से एक दो दिशात्मक चैनल के रूप में, EventArgs विरासत में नहीं। केवल एक मुद्दा जो मैं देख सकता हूं वह कई श्रोताओं/धागे के साथ होगा, लेकिन विनिर्देश जहां इसका उपयोग किया जाएगा, उस –

7

आप जेनेरिक प्रकार दृष्टिकोण के माध्यम से EventArgs क्लास का उपयोग कर सकते हैं। घटना की परवरिश

public EventHandler<Rect> SizeRectChanged; 

: इस नमूने में, मैं रेक्ट वर्ग के साथ वापसी प्रकार के रूप में इस्तेमाल करेगा

anyElement.SizeRectChanged += OnSizeRectChanged; 

public void OnSizeRectChanged(object sender, Rect e){ 
    //TODO abything using the Rect class 
    e.Left = e.Top = e.Width = e.Height = 50; 
} 
+1

यह काम नहीं करेगा क्योंकि EventHandler में 'जहां टीवेन्ट आर्ग्स: इवेंटआर्ग' की बाधा है। इसका मतलब है कि सामान्य प्रकार EventArgs से लिया जाना चाहिए। एक आय का उपयोग करने का प्रयास करने के परिणामस्वरूप एक कंपाइलर त्रुटि होगी। – BrandonLWhite

+4

इवेंटअर्स को विरासत में लाने के लिए बाधा कोनेट 4.5 में गिरा दिया गया है। – Dashu

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