2014-03-25 1 views
3

동일한 서명이있는 메소드가 포함 된 정적 클래스가 있습니다.코드 계약서 체크를 중복하지 않으려면 어떻게해야합니까?

static class SomeClass 
{ 
    static void SomeMethod(int param) 
    { 
     Contract.Requires<ArgumentException>(param != 0); 
     // some code 
    } 

    static void SomeMethod2(int param) 
    { 
     Contract.Requires<ArgumentException>(param != 0); 
     // some code 
    } 
} 

이 방법으로 CodeContract 검사를 복제 할 수있는 방법이 있습니까?

+0

일반용을 사용할 수 있는지 확인하십시오. –

+0

이 방법에는 제네릭을 사용할 수 없습니다. – Vlad

+1

필자는 개인적으로이 특정한 종류의 복제를 우연의 일치라고 생각하고 그것을 남겨둔다. (그 방법은 방법이 독립적이기 때문에 : 각자의 수표에, 그것들이 동일하면 오 잘) – Alex

답변

4

약식 약어를 사용할 수 있습니다. 그러나 개인적으로 나는 이런 간단한 점검을 위해 그것을하지 않을 것입니다. 여기에 우리가 사용하는 abbreviator에 대한 예는 다음과 같습니다

public static class ContractEx 
{ 
    [ContractAbbreviator] 
    public static void StringNullOrEmpty(string s, string parameterName) 
    { 
     Contract.Requires<ArgumentNullException>(s != null, parameterName); 
     Contract.Requires<ArgumentException>(s.Length != 0, parameterName); 
     Contract.Requires(!String.IsNullOrEmpty(s)); // required for static code analysis 
    } 
} 

사용법 :이 매개 변수가 자신의 이름을 지정해야하는 뚜렷한 단점이있다

void SomeMethod(string foo) 
{ 
    ContractEx.StringNullOrEmpty(foo, "foo"); 
} 

참고. 이를 생략 할 수 있지만 계약 재 작성자는 실패한 조건으로 s != null을 사용하여 예외를 방출하므로 인수 예외에 대해 아무런 의미가 없습니다.

약어는 대개 클래스의 상태를 확인하는 인스턴스 메서드로 더 적합합니다. 예 : (MSDN) :

[ContractAbbreviator] 
private void DataAndStateUnchanged() 
{ 
    Contract.Ensures(this.State == Contract.OldValue(this.State)); 
    Contract.Ensures(this.Data == Contract.OldValue(this.Data)); 
}