उदाहरण के लिए, मेरे पास बेस इवेंट प्रकाशन विधि है:.NET: घटना हर बार एक अच्छा अभ्यास आग लगने पर नया EventArgs बना रहा है?
protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}
एक व्युत्पन्न वर्ग के लिए जो OnSomeEvent
को ओवरराइड करता है और जब यह आग लग जाता है तो एक अतिरिक्त ईवेंट उठाता है:
protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);
if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}
और अगर व्युत्पत्ति इस तरह से चलती है, यह व्युत्पन्न कक्षा की प्रत्येक पीढ़ी के लिए एक नया व्युत्पन्न EventArgs बनाएगा जिसके लिए इसकी आवश्यकता है। हालांकि ऐसा लगता है कि .NET ढांचे पर EventArgs
के विभिन्न व्युत्पन्न को उत्परिवर्तनीय (कोई सेटर्स) नहीं बनाया गया है, यह किसी ऑब्जेक्ट को EventArgs का एक उदाहरण रखने से रोकता है और इसे संशोधित करता है।
तो हर बार इस तरह की आग की तरह एक घटना, यह सभी शामिल EventArgs
वस्तुओं के लिए स्मृति आवंटित करेगा। एक ग्राफिक तीव्र अनुप्रयोग में जहां एक घटना प्रति सेकंड दर्जनों बार ट्रिगर की जा सकती है (जैसे नियंत्रण पर OnPaint
घटना), क्या यह वाकई एक अच्छा अभ्यास है?
क्या मुझे OnExtendedEvent()
में कुछ बदलाव करना चाहिए और ExtendedEventArgs
mutable बनाना चाहिए ताकि निम्नलिखित संभव हो?
protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;
ExtendedEvent(this, extendedArgs);
}
संपादित करें: उदाहरण कोड फिक्स्ड, अब स्पष्ट होना चाहिए।
व्युत्पन्न कोई समस्या नहीं है, व्युत्पन्न वर्ग केवल बेस कॉल कर सकता है। EventArgs.Empty के साथ EXExtendedEvent। सामान्य रूप से, अल्पकालिक कचरा बनाने से डरो मत। –
मुझे लगता है कि आप mutable के बजाय अपरिवर्तनीय मतलब है। अपरिवर्तनीय मतलब है कि आप इसे बदल नहीं सकते हैं। – aaronb