코드에 명시 적으로 예외가 발생하는 경우 ArgumentNullException
을 선택해야합니다. Null 참조/포인터 역 참조 할 때
NullReferenceException
는 CLR에 의해 자동으로 발생합니다 :
이 가장 일반적으로 메서드 또는 속성이 Null 참조에 호출 될 때 발생
unsafe
{
int* ptr = (int*)0; // Casting 0 to pointer is null reference.
int val = *ptr; // NullReferenceException thrown.
}
:
string s = null;
string substring = s.Substring(0, 2); // NullReferenceException thrown.
에서 대부분의 경우 NullReferenceException
을 코드에서 명시 적으로 throw해서는 안됩니다.
ArgumentNullException
은 일반적으로 NullReferenceException
을 방지하기 위해 null 참조가 매개 변수로 전달되는 경우를 확인하는 데 사용됩니다.
static string firstTwo(string s)
{
if (s == null)
{
throw new ArgumentNullException("s");
}
return s.Substring(0, 2); // without the original check, this line would throw a NullReferenceException if s were null.
}
이 점검의 목적은 호출자에게 널 (null)이 전달되었고 널 (null)이 허용되지 않음을 분명히 알리는 것입니다. 당신은 단순히 NullReferenceException
슬로우 할 경우 체크를 사용하는 경우 그렇지 않은 경우, 발신자는 (
개체 참조가이만큼 의미가 아닌 객체
의 인스턴스로 설정되지 않았습니다 볼 것) :
값은 null 일 수 없습니다.매개 변수 이름 : 그들은 모양의
* 다른 하나를 선택해야합니다. * 어떤 것을 던져야하나요, 어떤 일을 일으켜야합니까? – DaveShaw
답변이이 질문과 관련이있는 http://stackoverflow.com/questions/463302/argumentnullexception-or-nullreferenceexception-from-extension-method과 매우 유사한 질문입니다. – hatchet
어느 쪽도 사용할 수 없습니다. NRE는 dereferencing null로 실제로 죽은 프로그램을 위해 예약되어야합니다. NRE에서 ArgumentNullException을 사용하여 * 넘어지지 않도록 방지합니다. 클라이언트 프로그래머에게 "나는 * 당신이 잘못하고 있음을 알고있다. 결코 널 귀찮게하지 않는다."라고 말한다. NRE는 그런 절묘한 메시지를 보내지 않습니다. 던져 질 때 그것이 당신의 버그인지 또는 도서관의 버그인지 확신 할 수 없습니다. –