C # 6 के बाद से, आप इसका उपयोग कर सकते हैं:
MyEvent?.Invoke();
या:
obj?.SomeMethod();
?.
अशक्त-प्रचार ऑपरेटर है, और कारण होगा .Invoke()
शॉर्ट सर्किट होने के लिए जब संकार्य है null
। ऑपरेंड केवल एक बार एक्सेस किया जाता है, इसलिए "चेक और इनवोक के बीच मूल्य परिवर्तन" समस्या का कोई जोखिम नहीं है।
===
C # 6 से पहले, नहीं: एक अपवाद के साथ कोई शून्य-सुरक्षित जादू नहीं है; विस्तार के तरीके - उदाहरण के लिए:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
अब यह मान्य है:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
घटनाओं के मामले में, यह दौड़-स्थिति को हटाने का भी लाभ है, अर्थात आपको एक अस्थायी चर की आवश्यकता नहीं है। तो आम तौर पर आप की आवश्यकता होगी:
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
लेकिन इसके साथ:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
हम बस का उपयोग कर सकते हैं:
SomeEvent.SafeInvoke(this); // no race condition, no null risk