Nob*_*ody 17 c# resharper design-by-contract visual-studio-2010 code-contracts
这是我的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用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));
}
}
Run Code Online (Sandbox Code Playgroud)
以上测试也通过,我无法弄清楚为什么!
起初我以为ReSharper可能会弄乱一些东西,因为它会在我尝试使用Contract命名空间中的方法时显示该行并显示此消息:
跳过方法调用.编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法.
但暂停R#并在NUnit中运行测试具有相同的结果,VS中也没有错误或警告.所以我认为这只是因为ReSharper还没有强调代码合同的兼容性.
我查看了文档,据我所知,我不应该遇到这个问题.
我是否正确使用代码合同或是我的环境阻止它以某种方式工作?
谢谢.
Jon*_*eet 18
要检查的第一件事 - 你实际上是否开启了合同检查?如果没有,你的合同都不会做任何事情.这也可以解释R#警告.查看构建属性中的"代码约定",并查看"运行时检查"下的内容.
根据评论,确保您已CONTRACTS_FULL定义为编译符号 - 这似乎是R#所需要的.
第二点:你有公共可变字段,这意味着你的不变量可以随时被某人写下来侵犯
polygon.VertexCount = 0;
Run Code Online (Sandbox Code Playgroud)
请不要使用公共字段,特别是不可写的字段.:)
| 归档时间: |
|
| 查看次数: |
5343 次 |
| 最近记录: |