왜 null 대신 eventargs.empty를 사용합니까?
문제
나는 여러 차례와 여러 위치에서 일반적인 이벤트를 발사 할 때 읽는 것을 기억합니다.
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
흥미로운 이벤트 args가없고 null이없는 경우 e는 eventargs.empty해야합니다.
나는 내 코드의 지침을 따랐지만 그것이 왜 그것이 선호하는 기술인지 명확하지 않다는 것을 깨달았습니다. 명시된 계약이 왜 null보다 eventargs를 선호합니까?
해결책
NOT NULL의 추론은 매개 변수로 전달 될 때 NULL 참조 예외를 잠재적으로 처리 해야하는 방법이 예상되지 않는다고 생각합니다.
당신이 null을 통과하고 메소드가 e로 무언가를하려고 시도하면 null 참조 예외가 발생합니다.
다른 팁
EventArgs.Empty
인스턴스입니다 널 객체 패턴.
기본적으로, 사용할 때 NULL을 확인하지 않기 위해 "값 없음"을 나타내는 객체가 있습니다.
나는 믿는다 EventArgs.Empty
아무도 필요하지 않더라도 이벤트와 논쟁을 통과하는 협약을 유지하는 데 사용됩니다.
Mitchel Sellers는 내 이유의 나머지 절반을 내 게시물의 중간 쯤에 게시했습니다. 메소드가 해당 인수로 무언가를 시도하고 수행하면 널 참조 예외를 방지합니다 (NULL인지 확인하는 것 외에).
EventArgs.Empty
기본적으로 추가 정보가없는 전 세계적으로 정의 된 이벤트 인수의 작업을 수행합니다.
컨벤션을 유지하는 비슷한 예를 제공하기 위해 우리 팀은 string.Empty
다른 코더가 사용할 수 있으므로 문자열을 초기화하려면 newString = ""; or newString = " "; or newString = null;
, 모두 검사 조건에 대해 다른 결과를 생성 할 수 있습니다.
사용해야 할 이유 (약간의 소포 적) 이유 EventArgs.Empty
vs new EventArgs()
전자는 새로운 것을 초기화하지 않는다는 것입니다 EventArgs
, 약간의 메모리를 저장합니다.
일반 목적 방법을 사용하는 경우 EventHandler
모든 이벤트 핸들러에서 호출되는 서명과 object sender
그리고 EventArgs e
, 그것은 호출 할 수 있습니다 e.ToString()
, 예를 들어, 널 포인터 예외에 대해 걱정하지 않고 로깅 이벤트를 위해.
나는 "eventargs.empty"대신 오랫동안 "new eventargs ()"을 사용했습니다 ... 중요한 것은 널 예외를 유발하지 않는 것을 전달하는 것입니다.
Albahari Book에서 : "in order to avoid unnecessarily instantiating an instance of EventArgs."