답변:
Assert를 사용하지 말아야 할 이유가 없습니다. 그렇게함으로써, 당신은 이미 전제 조건과 불변 인과 같은 경비원의 필요성을 인정했고 계약에 의한 설계 로 나아가고 있습니다. Assert는 이것을 달성하는 한 가지 방법 일뿐입니다 ...
// Precondition using Asert
void SomeMethod(Foo someParameter)
{
Debug.Assert(someParameter != null)
}
// Precondition using If-Then-Throw
void SomeMethod(Foo someParameter)
{
if (someParameter == null)
throw new ArgumentNullException("someParameter");
}
// Precondition using Code Contracts
void SomeMethod(Foo someParameter)
{
Contract.Requires(someParameter != null);
}
// Precondition using some custom library
void SomeMethod(Foo someParameter)
{
Require.ArgumentNotNull(() => someParameter);
}
모두 같은 것을 달성하는 방법입니다 : 코드의 견고성. 옵션을 선택하면 Assert가 올바른 선택입니다.
유닛 테스트는 지금까지 전혀 다른 것을 달성하지 않았으므로 언급하지 않았습니다. 단위 테스트는 가드를 실행하여 코드의 견고성을 공식적으로 증명합니다.
[Test]
void SomeMethod_WhenGivenNull_ThrowsArgumentNullException()
{
delegate call = () => someObject.SomeMethod(null);
Assert.That(call).Throws<ArgumentNullException>();
}
이것은 완전히 다른 종류의 주장입니다 ...
** 일부 프레임 워크에서는 어설 션 오류로 인해 전체 런타임이 중단 될 수 있으므로 다른 옵션 중 하나가 선호 될 수 있으므로 어설 션 오류에 대한 단위 테스트는 실제로 매우 어렵습니다. *
요즘 Debug.Assert를 조기 최적화로 봅니다. 실제로 성능이 필요하지 않은 경우 릴리스 모드에서 Assert를 억제하면 버그를 더 오래 숨길 수 있습니다.
MattDavey가 지적한 것처럼 코드 계약 은 동적 검사 대신 정적 검사를 제공하는 것이 우수 할 수 있으며, 사용할 수없는 경우 Trace.Assert 또는 평범한 오래된 것을 선호합니다.if(x) throw SomeException;
Debug
클래스의 메소드에 대한 모든 호출이 컴파일에서 생략됩니다. 따라서 Assert
단순히 성능 을 위해 호출을 억제 하는 것은 조기 최적화가 아니라 평범한 말이 아닙니다.