2012-09-06 3 views
2

프로젝트 속성에서 런타임 계약 검사를 사용하지 않도록 설정하면 FxCop 위반이 계약 클래스에 발생합니다 (인터페이스를 통해 계약을 구현 한 다음 추상 클래스에서 계약을 정의한다고 가정).런타임 검사가 비활성화 된 경우 FXCop이 계약 클래스에 대한 위반을 던지는 이유는 무엇입니까?

다시 활성화 ..

그 이유는 무엇인가를 실행 계약 검사를 모든 위반 사라?

CA1811 ObjectInvariant이

CA1033은 MyClassContract이 이해가되지 않는

봉인 확인 더 상류 호출자이없는 것으로 나타납니다처럼

위반 계약 클라스 이후 sses는 추상적이어야합니다.

+0

어떤 FXCop 규칙을 위반합니까? 자세한 내용을 알려 주실 수 있습니까? – akton

+0

위반 사항이 추가되었습니다. – MalcomTucker

+0

"추상 클래스에서 계약서 정의"의 의미를 코드로 자세히 설명해 주시겠습니까? –

답변

6

좋아요, 무슨 뜻인지 알 것 같습니다. 당신은 케빈의 AccountContracts 대신 InvariantsObjectInvariants라는 이름의 개인 방법 MyClassContract 이름과 같은 클래스가 :

[ContractClassFor(typeof(IAccount))] 
public abstract class MyClassContract : IAccount 
{ 
    public abstract double Balance { get; } 

    void IAccount.Deposit(double amount) 
    { 
     Contract.Requires(amount >= 0.0d); 

     //throw new NotImplementedException(); 
    } 

    bool IAccount.Withdraw(double amount) 
    { 
     Contract.Requires(amount >= 0.0d); 
     Contract.Requires(amount <= Balance); 

     throw new NotImplementedException(); 
    } 

    [ContractInvariantMethod] 
    private void ObjectInvariants() 
    { 
     Contract.Invariant(Balance >= 0.0d); 
    } 
} 

FxCopy 및 코드 분석 분석을 포스트 컴파일 않습니다. 그것은 바이너리, 즉 빌드에 의해 생성 된 중간 언어 (IL)를 분석합니다. 코드 계약 종류는 컴파일 후 직조를 수행합니다. 즉, 추상 클래스 MyClassContract에서 파생 될뿐만 아니라 적어도 ObjectInvariants 메소드를 호출하는 바이너리로 코드를 생성합니다. 코드 계약을 "해제"하면 더 이상이 코드가 생성되지 않으므로 FxCop 및 코드 분석에서는 MyClassContract 또는 ObjectInvariants 메서드에서 파생 된 것이므로 경고 메시지가 표시되지 않으므로 경고 메시지가 표시됩니다. MyClassContract의 경우 아무 것도 파생되지 않으므로 봉인 될 수 있습니다 (컴파일러가 특정 환경에서 약간만 최적화하는 데 도움이 됨). 나중에 클래스를 유지 관리하기가 쉽습니다 (아무 것도 에서 파생되므로 당신은 그것을 자유롭게 바꿀 수 있습니다 - 적어도 그것은 일반적인 합의입니다.)

경고가없는 상태로 코드를 유지하려면 억제 파일에서 해당 경고를 억제 할 수 있습니다. 컴파일러 상수를 포함하고 코드 계약을 사용하지 않을 때 컴파일을 피하기 위해 코드를 둘러싸고 코드 계약을 사용할 때 빌드 설정에 상수를 포함시킬 수도 있습니다. 예를 들어 당신이 두 코드 계약을 활성화하고 프로젝트에 CODE_CONTRACTS 속성을 구축 선언 특정 빌드 구성을 가질 수 있기 때문에

#if CODE_CONTRACTS 
//... 
#endif 

새로운 빌드 설정을 생성이 가장 쉬운 것은 보통이다.

+0

죄송합니다, 나는 떨어져 있었고, 돌아 왔습니다. 너의 현상금을 너에게 줄거야 - 나 아직도 할 수 있을까? – MalcomTucker