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