C# · 12月 25, 2021

c# – 代码合同:我们必须在委托方法中冗余地指定Contract.Requires(…)语句?

我打算使用新的.NET 4代码合同功能来进行开发.这让我想知道我们是否必须在一系列方法中冗余地指定等价的Contract.Requires(…)语句.

我认为代码示例值得一千字:

public bool CrushGodzilla(string weapon,int veLocity) { Contract.Requires(weapon != null); // long code return false; } public bool CrushGodzilla(string weapon) { Contract.Requires(weapon != null); // specify contract requirement here // as well??? return this.CrushGodzilla(weapon,int.MaxValue); }

对于运行时检查,这并不重要,因为我们最终总是会遇到需求检查,如果失败,我们会收到错误.

但是,当我们再次在第二次重载中未指定合同要求时,是否认为是不良做法?

此外,还将编译时间检查功能,也可能设计代码合同的时间检查.它似乎尚未在Visual Studio 2010中使用C#,但我认为有一些语言,如Spec#已经做了.当我们编写代码来调用这样的方法时,这些引擎可能会给我们提示,我们的参数当前可以是或将为null.

所以我想知道这些引擎是否会始终分析一个调用堆栈,直到找到一个当前不满足的合同的方法?

此外,here I learned about the difference between Contract.Requires(…) and Contract.Assume(…).我想这个差异也是在这个问题的背景下考虑的呢?

解决方法 我认为最好的做法是规定每种公共方法的所有合同.合同不仅仅是“什么被检查” – 它的文档也是有效的.如果你调用一个方法,但是不知道应用什么契约,那么合同失败可能会降低一点:这表示你所调用的方法的错误,而不是你的方法.

请注意,如果您在整个项目中使用C#4,您可以考虑使用可选参数和命名参数来避免这么多重载.如果您需要从不支持这些语言的语言调用代码,那就没有用.

我强烈怀疑,如果您没有在“默认”超载中指定合同,则静态检查器(现在为available for all versions of VS2010)将抱怨合同可能会失败,并且还会建议在其中添加合同.