좋아요, 무슨 뜻인지 알 것 같습니다. 당신은 케빈의 AccountContracts
대신 Invariants
의 ObjectInvariants
라는 이름의 개인 방법 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
새로운 빌드 설정을 생성이 가장 쉬운 것은 보통이다.
어떤 FXCop 규칙을 위반합니까? 자세한 내용을 알려 주실 수 있습니까? – akton
위반 사항이 추가되었습니다. – MalcomTucker
"추상 클래스에서 계약서 정의"의 의미를 코드로 자세히 설명해 주시겠습니까? –