2010-08-18 1 views
4

코드 계약에 대한 간단한 테스트를하고 있습니다. 다음 코드는 winform에 있습니다. 이것은 (물론) 전달합니다C# 코드 계약 :이 간단한 조건을 입증 할 수없는 이유는 무엇입니까?

private void Test(Form form) 
    { 
     Contract.Requires(!string.IsNullOrEmpty(form.Name)); 

     MessageBox.Show(form.Name); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     if (!string.IsNullOrEmpty(Name)) 
      Test(this); 

     base.OnLoad(e); 
    } 

는 그러나, 나는 간접 그냥 아주 간단한 수준을 추가, 그것은 "증명이 필요합니다"라고 : 그것을 증명 사소한 것처럼

private bool Valid(string str) 
    { 
     return !string.IsNullOrEmpty(str); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     if (Valid(Name)) 
      Test(this); 

     base.OnLoad(e); 
    } 

이 보인다. 왜 작동하지 않는거야?

답변

6

Valid 메서드에 대한 계약이 없습니다. 당신은 계약서를 표현할 수 있습니다. 아마도 그 코드는 아마도 똑같을 것입니다. 그러나 코드 계약서는 그것을 가정하지 않을 것입니다. 구현이 변경 될 수 있습니다. 코드 계약에서 은 수행 할 방법이 인 것을 의미하지 않으므로 구현에서 아무 것도 가정하지 않습니다.

+0

흠, 괜찮아. 그것은 다소 덜 유용하게 보이지만, 나는 그것에 대해 당신의 말을 할 것입니다. –

1

string.IsNullOrEmpty(str)으로 전화하는 방법이 정말로 필요합니까? 그리고 String.IsNullOrEmpty(string)은 이미 BCL에서 [Pure]으로 표시되어 있으며 래퍼가 관련이 없으므로 직접 호출하면 전체 문제가 해결됩니다.

정말이 방법에 대해 강하게 느끼는 경우

은,이 현재 코드로 작동 할 수있는 한 가지 방법은 당신의 Test 방법에 계약을 변경하는 것입니다 :
private void Test(Form form) 
{ 
    Contract.Requires(Valid(form.Name)); 

    MessageBox.Show(form.Name); 
} 

[Pure] 
private bool Valid(string str) 
{ 
    return !string.IsNullOrEmpty(str); 
} 

이제 정적 분석기는 불평을해서는 안된다.