如何在.NET 4.0中使用代码合约而不使我的代码看起来混乱?

8

我开始使用代码合约,并发现它使得立即识别方法的“实质”变得困难。

看这个(非常简单的)例子:

public static void UserAddNew(string domain, string username, string displayName)
{
    Contract.Assert(!string.IsNullOrWhiteSpace(domain));
    Contract.Assert(!string.IsNullOrWhiteSpace(username));
    Contract.Assert(!string.IsNullOrWhiteSpace(displayName));

    LinqDal.User.UserAddNew(domain, username, displayName);
}

现在我想把合同放在一个区域里,这样它们就可以被隐藏起来,但我担心失去了一个很好的优势,即能够瞥一眼方法并看到它期望什么。
你是怎样保持你的合同“整洁”的?或者说我太过于挑剔了吗?

可能是重复的问题:“如何在不使代码看起来混乱的情况下添加新功能到我的应用程序中?” - Cody Gray
3
据我所知,这并不是 Code Contracts 特有的新问题 - 在 CC 出现之前,该方法就已经检查了参数,对吗?除了一点空格外,我没有其他的解决方案… - Mormegil
我同意Mormegil的观点。在C++之前,你应该写成“if(condition) throw new argumentexception”。 - koenmetsu
1
只是一个相关的注释,这里使用Contract.Requires()会比使用Contract.Assert()更有意义。这会对调用代码产生影响。 - H H
1个回答

6
请查看 ContractClass 和 ContractClassFor 属性。 这允许您编写具有代码契约的类并将其放在单独的程序集中,以便在开发过程中可以使用契约,不会使代码混乱,并且也意味着您不必将契约与实际代码一起部署。详见:Contract Class AttributeContract Class For Attribute

1
没错,但是这在他示例中使用的静态方法上行不通。 - koenmetsu
1
此外:部署合约取决于您在代码合约属性窗格中使用的设置。如果没有正确的设置而不部署合约,将会给您带来麻烦。 - koenmetsu
我会假设开发人员已经阅读了关于如何使用该功能的文档。 :) - Ray Booysen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接