C # 6부터는 다음을 사용할 수 있습니다.
MyEvent?.Invoke();
또는:
obj?.SomeMethod();
는 ?.
널 전파 연산자이며,이 발생할 .Invoke()
오퍼랜드 인 경우 단락 될 null
. 피연산자는 한 번만 액세스되므로 "확인 및 호출 사이의 값 변경"문제의 위험이 없습니다.
===
C # 6 이전에는 아니요 : 한 가지 예외를 제외하고는 null-safe 마법이 없습니다. 확장 방법-예 :
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