예, 그럴만 한 이유가 있습니다.
- null이 무엇인지 정확히 식별합니다.
NullReferenceException
- 다른 조건이 값이 역 참조되지 않음을 의미하더라도 잘못된 입력에서 코드가 실패하게 만듭니다.
- 메서드가 첫 번째 역 참조 전에 도달 할 수있는 다른 부작용을 갖기 전에 예외가 발생 하도록합니다.
- 그것은 당신이 뭔가에 매개 변수를 전달하면 것을 확신 할 수 있다는 것을 의미합니다, 당신은 위반하지 않는 자신의 계약을
- 그것은 당신의 방법의 요구 사항을 문서화합니다 ( 물론 코드 계약을 사용하는 것이 더 좋습니다)
이제 귀하의 이의 제기 :
- 더 느립니다 : 이것이 실제로 코드의 병목 현상임을 발견 했습니까 , 아니면 추측하고 있습니까? Nullity 검사는 매우 빠르며 대부분의 경우 병목 현상이 발생 하지 않습니다.
- 코드를 유지하기가 더 어려워집니다 . 그 반대라고 생각합니다. 매개 변수가 null 일 수 있는지 여부와 해당 조건이 적용된다는 확신이있는 경우 코드를 사용하는 것이 더 쉽다고 생각합니다 .
그리고 당신의 주장 :
분명히 s를 사용하는 코드는 어쨌든 예외를 던질 것입니다.
정말? 중히 여기다:
void f(SomeType s)
{
Console.WriteLine("I've got a message of {0}", s);
}
를 사용 s하지만 예외는 발생하지 않습니다. snull이되는 것이 유효하지 않고 문제가 있음을 나타내는 경우 여기에서 예외가 가장 적절한 동작입니다.
이제 인수 유효성 검사를 어디에 두는 것은 다른 문제입니다. 자신의 클래스 내의 모든 코드를 신뢰하기로 결정할 수 있으므로 개인 메서드에 신경 쓰지 마십시오. 나머지 어셈블리를 신뢰하기로 결정할 수 있으므로 내부 메서드에 신경 쓰지 마십시오. 공용 메서드에 대한 인수의 유효성을 거의 확실하게 확인해야합니다.
참고 :의 단일 매개 변수 생성자 오버로드 ArgumentNullException는 매개 변수 이름이어야하므로 테스트는 다음과 같아야합니다.
if (s == null)
{
throw new ArgumentNullException("s");
}
또는 확장 메소드를 생성하여 다소 간결하게 할 수 있습니다.
s.ThrowIfNull("s");
내 버전의 (일반) 확장 메서드에서는 null이 아닌 경우 원래 값을 반환하여 다음과 같은 내용을 작성할 수 있습니다.
this.name = name.ThrowIfNull("name");
너무 신경 쓰지 않으면 매개 변수 이름을 사용하지 않는 오버로드를 가질 수도 있습니다.