IMHO, 매개 변수가있는 공용 메서드는 다른 프로그래머가 호출 할 수 있으므로 매개 변수 값을 확인하고 해당 매개 변수가 유효하지 않은 경우 의미가 유용합니다 (ArgumentException
). 이 이상 ...공용 메서드에서 코드 계약을 사용하려는 이유는 무엇입니까?
public void Toto(string parameter)
{
Contract.Requires(parameter != null);
//...
}
:
말했다되고 그건, 왜 나는이 선호?
public void Toto(string parameter)
{
if (parameter == null)
throw new ArgumentNullException(nameof(parameter));
//...
}
첫 번째 시나리오에서 런타임 계약 검사는 예외가 발생하도록 설정되어야합니다. 우리가 알고있는 것처럼이 옵션은 릴리스 빌드에 대해 선택되지 않아 매개 변수 유효성 검사가 발생하지 않을 것입니다. 발표 된 제품의 일부로 알 수도 있고 그렇지 않을 수도있는 사람이 사용하기로되어있는 공개 방법의 경우 이는 잘못된 생각처럼 보입니다.
또한 런타임 빌드가 릴리스 확인에 사용되는 경우 일반 .NET 개발자가 예상하는 예외 (이 경우 ArgumentNullException
)는 예외가됩니다.
그래서 나는 무엇을 놓치고 있습니까? 왜 "전통적인"if-throw 패턴보다 코드 계약을 사용합니까?
[예외를 던집니다. Contract.Requires?] (http://stackoverflow.com/questions/14991647/throwing-an-exception-vs-contract-requirest) –