2012-01-30 5 views
11

이전에 StackOverflow에서이 문제에 대한 토론이 있었지만 다시 찾을 수 없습니다.Release 빌드에서 System.Diagnostics.Contract 사용

System.Diagnostics.Contract 클래스를 '실제 코드', 즉 프로덕션 코드의 릴리스 빌드에 사용해야하는지 알고 싶습니다. 이것은 네임 스페이스 설명에 기반하여 계약서가 디버깅 또는 분석 목적으로 표시되기 때문에이를 묻습니다.

기능에 대한 사전/사후 조건이 중요하고 많은 if/then/else 검사를 작성하는 데 드는 노력을 피할 수있는 유용한 라이브러리 인 것 같습니다. 그렇다면이 경우에 대안이 있습니까? 핵심 라이브러리?

+1

제목 앞에 "C#"을 붙이지 마십시오. 그것이 바로 태그가있는 것입니다. –

답변

11

5.1 절 (인수 확인 및 계약)을 documentation의 당신이 계약을 사용하기 위해 고려할 수있는 세 가지 사용 모드 자세한 사항 : 만 디버그의 계약을 통해

  1. 인수 유효성 검사를하지 릴리스 빌드에서 빌드.
  2. 릴리스 빌드의 유효성 검사.
  3. 릴리스 빌드에서 사용자 정의 인수 유효성 검사, 디버그 빌드에서만 계약.

릴리스 빌드에서 계약서를 사용할 최소한 하나의 사용 모드가 있습니다 (적어도 공식 문서와 관련하여).

인용구 :

자신의 코드에서 계약을 사용하기 전에, 당신이 영향을 어떤 계약 형태의 인수 유효성 검사 및 경우 (그림 2 참조)에 사용하는 것을 몇 가지 결정을 내릴 필요가있다. 생성 된 각 관리되는 어셈블리 (각 프로젝트)에 대해 이러한 결정을 독립적으로 수행 할 수 있습니다.

계약 빌드 도구에서 런타임에 인수 유효성 검사를 수행 할 필요가 없다고 결정하면 가장 쉽게 사용할 수 있습니다 사용법 1). 이 경우 개발 도중 계약 도구를 사용하지만 출하 된 비트는 사용하지 마십시오. 릴리즈 노트와 함께 계약 참조 어셈블리를 출시 할 수 있으므로 고객은 콜 사이트 요구 확인을 통해 디버그 빌드에서 매개 변수 유효성 검사에 대한 런타임 검사를받을 수 있습니다.

릴리스 빌드에서 인수 유효성 검사가 필요한 경우 두 번째로 쉬운 방법은 모든 빌드 (계약 2)에서 계약 검사를 설정하는 것입니다. 따라서 도구를 사용하여 조건의 런타임 문자열을 생성하고 계약 상속을 수행 할 수 있습니다. 매개 변수 유효성 검증을 위해 특정 예외를 생성하도록 선택하거나 기본 ContractException을 가질 수 있습니다. 릴리스 빌드에서 계약 도구를 사용할 위험은 생산 품질 수준에 도달하지 않은 도구에 의존한다는 것입니다.

가장 복잡한 조합은 릴리스 빌드에서 인수 유효성 검사를 사용하려는 경우이지만 디버그 빌드에서만 런타임 검사에 계약 도구를 사용하지만 릴리스 빌드 (사용법 3)에서는 사용하지 않는 것이 가장 좋습니다. 이 경우 이미 if-then-throw 문을 사용하여 인수 검증을 계속 작성해야합니다 (우리는 legacy-requires라고 부릅니다). 이러한 도구를 검색 가능하게하려면 다른 계약 (예 : 보증)을 추가하거나 다른 계약이없는 경우 Contract.EndContractBlock()을 사용하십시오. 릴리스 빌드에서 런타임 검사 도구를 사용하지 않으므로 계약의 상속을받지 않으므로 재정의 및 인터페이스 구현에서 레거시 - 필수를 수동으로 반복해야합니다.인터페이스와 추상 메소드의 경우 일반 요구 사항으로 계약 클래스를 작성하고 양식을 보장하여 디버그 빌드를 체크인하고 계약 참조 어셈블리에 나타나고 따라서 종속 프로젝트 및 정적 체커에 표시되는 경우 가장 많은 benet을 얻습니다.

이렇게하면 프레임 워크의 다른 부분 만 사용하는 대체 방법이 무엇인지 알 수 있습니다. if-then-throw를 사용하는 일반적인 방법.