代码之家  ›  专栏  ›  技术社区  ›  J Cooper

C代码契约:为什么不能证明这个简单的条件?

  •  4
  • J Cooper  · 技术社区  · 14 年前

    我正在做一个简单的代码契约测试。下面的代码是winform。这个过程(当然):

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

    这似乎是微不足道的证明。为什么不起作用?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    Valid 意味 所以它不从实现中假设任何东西。

        2
  •  1
  •   fourpastmidnight    8 年前

    string.IsNullOrEmpty(str) ? 从那以后呢 String.IsNullOrEmpty(string) 已标记为 [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);
    }
    

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