c# - मैं सी#में ईवेंट सदस्यता कैसे साफ़ कर सकता हूं?




.net events (6)

निम्नलिखित सी # कक्षा लें:

c1 {
 event EventHandler someEvent;
}

यदि c1 की someEvent घटनाओं के लिए बहुत सारी सदस्यताएं हैं और मैं उन्हें सब साफ़ करना चाहता हूं, तो इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? यह भी मान लें कि इस घटना की सदस्यता lambdas / अनाम प्रतिनिधि हो सकती है।

वर्तमान में मेरा समाधान एक ResetSubscriptions() विधि को c1 जोड़ना है जो someEvent को शून्य करने के लिए सेट करता है। मुझे नहीं पता कि इसका कोई अदृश्य परिणाम है या नहीं।


सभी घटनाओं को हटाएं, मान लें कि ईवेंट एक "एक्शन" प्रकार है:

Delegate[] dary = TermCheckScore.GetInvocationList();

if ( dary != null )
{
    foreach ( Delegate del in dary )
    {
        TermCheckScore -= ( Action ) del;
    }
}

आप Delegate का उपयोग करके इसे प्राप्त कर सकते हैं। हटाएं या Delegate.Remove सभी विधियों।


कक्षा के भीतर से, आप (छुपा) चर को शून्य पर सेट कर सकते हैं। एक शून्य संदर्भ प्रभावी रूप से खाली आमंत्रण सूची का प्रतिनिधित्व करने का वैधानिक तरीका है।

कक्षा के बाहर से, आप यह नहीं कर सकते - घटनाएं मूल रूप से "सब्सक्राइब करें" और "सदस्यता समाप्त करें" का पर्दाफाश करती हैं और यही वह है।

यह जानना उचित है कि क्षेत्र की तरह की घटनाएं वास्तव में क्या कर रही हैं - वे एक चर और एक ही समय में एक ईवेंट बना रहे हैं। कक्षा के भीतर, आप चर को संदर्भित करते हैं। बाहर से, आप घटना का संदर्भ देते हैं।

अधिक जानकारी के लिए घटनाओं और प्रतिनिधियों पर मेरा आलेख देखें।


यह मेरा समाधान है:

public class Foo : IDisposable
{
    private event EventHandler _statusChanged;
    public event EventHandler StatusChanged
    {
        add
        {
            _statusChanged += value;
        }
        remove
        {
            _statusChanged -= value;
        }
    }

    public void Dispose()
    {
        _statusChanged = null;
    }
}

आपको आमंत्रण सूची के सभी सदस्यों की सदस्यता समाप्त करने के लिए Dispose() या using(new Foo()){/*...*/} पैटर्न using(new Foo()){/*...*/} उपयोग using(new Foo()){/*...*/} उपयोग करने की आवश्यकता है।


सी 1 में एक विधि जोड़ें जो 'someEvent' को शून्य पर सेट करेगा ...

class c1
{
    event EventHandler someEvent;
    ResetSubscriptions() {someEvent = null;}
}

संकल्पनात्मक विस्तारित उबाऊ टिप्पणी।

मैं बजाय "घटना" या "प्रतिनिधि" के बजाय "ईवेंट हैंडलर" शब्द का उपयोग करता हूं। और अन्य सामान के लिए "घटना" शब्द का इस्तेमाल किया। कुछ प्रोग्रामिंग भाषाओं में (वीबीएनईटी, ऑब्जेक्ट पास्कल, ऑब्जेक्टिव-सी), "इवेंट" को "संदेश" या "सिग्नल" कहा जाता है, और यहां तक ​​कि "संदेश" कीवर्ड और विशिष्ट चीनी वाक्यविन्यास भी होता है।

const
  WM_Paint = 998;  // <-- "question" can be done by several talkers
  WM_Clear = 546;

type
  MyWindowClass = class(Window)
    procedure NotEventHandlerMethod_1;
    procedure NotEventHandlerMethod_17;

    procedure DoPaintEventHandler; message WM_Paint; // <-- "answer" by this listener
    procedure DoClearEventHandler; message WM_Clear;
  end;

और, उस "संदेश" का जवाब देने के लिए, एक "ईवेंट हैंडलर" जवाब देता है, चाहे एक प्रतिनिधि या एकाधिक प्रतिनिधि हों।

सारांश: "घटना" "प्रश्न" है, "घटना हैंडलर" उत्तर हैं (ओं)।





delegates