我错误地实施了这个简单的合同吗?
这是我的代码:
public class RegularPolygon { public int VertexCount; public double SideLength; public RegularPolygon(int vertexCount, double sideLength) { Contract.Requires(vertexCount >= 3); VertexCount = vertexCount; SideLength = sideLength; } [ContractInvariantMethod] private void RegularPolygonInvariants() { Contract.Invariant(VertexCount>=3); } }
我尝试使用Contract.Requires和Contract.Invariant方法来防止vertexCount变量小于或等于2; 但是我仍然能够初始化一个具有2个或更少边的RegularPolygon。 我的(简化)NUnit测试如下所示:
[TestFixture] class TestRegularPolygon { private RegularPolygon _polygon; [SetUp] public void Init() { _polygon = new RegularPolygon(1, 50); } [Test] public void Constructor() { Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3)); } }
以上测试也通过,我无法弄清楚为什么!
起初我以为ReSharper可能会弄乱一些东西,因为它会在我尝试使用Contract
命名空间中的方法时显示该行并显示此消息:
跳过方法调用。 编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法。
但暂停R#并在NUnit中运行测试具有相同的结果,VS中也没有错误或警告。 所以我认为这只是因为ReSharper还没有强调代码合同的兼容性。
我查看了文档,据我所知,我不应该遇到这个问题。
我是否错误地使用了代码合同,或者我的环境阻止它以某种方式工作?
谢谢。
要检查的第一件事 – 你实际上是否开启了合同检查? 如果没有,你的合同都不会做任何事情。 这也可以解释R#警告。 查看构建属性中的“代码合同”,并查看“运行时检查”下的内容。
根据评论,确保将CONTRACTS_FULL
定义为编译符号 – 这似乎是R#所需要的。
第二点:你有公共可变字段,这意味着你的不变量可以随时被某人写作侵犯
polygon.VertexCount = 0;
请不要使用公共字段,特别是不可写的字段。 ?
上述就是C#学习教程:我错误地实施了这个简单的合同吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1028058.html