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