2010-08-18 26 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

嗯,好的。这看起来有点用处不大,但我会接受你的话。 – 2010-08-18 23:38:29

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); 
} 

现在的静态分析不应该抱怨。

相关问题