我正在用C#编写ReSharper 8.0和VS2012 for .Net 4.0。
ReSharper包含一个属性:JetBrains.Annotations.PureAttribute。这用于提供检查“不使用纯方法的返回值”。
代码合同包含一个属性:System.Diagnostics.Contracts.PureAttribute。代码合同检查使用它来确保调用不会产生可见的状态更改,因此不需要重新检查对象的状态。
目前,要获得这两种工具的功能,需要使用每种方法的属性对方法进行注释。更糟糕的是,因为它们都具有相同的类型名称,所以您需要对每个属性进行限定。
[Pure]
[Jetbrains.Annotations.Pure]
public bool isFinished() {
...
为避免这种情况,应该有三种方法:
这些都有可能吗?
答案 0 :(得分:5)
ReSharper已经了解System.Diagnostics.Contracts.PureAttribute
并将其视为与JetBrains.Annotations.PureAttribute
相同,因此您只需使用代码合同中的一个,这两个工具都会很高兴。
答案 1 :(得分:2)
方法3提供了解决方案:Jetbrains.Annotations.PureAttribute
被合同识别。
但是,在代码中使用Contracts和PureAttribute时,仍会遇到名称冲突问题。这可以使用using语句缩短:using RPure = Jetbrains.Annotation.PureAttribute;
以下是一些代码,演示了为Contracts和ReSharper成功运行的属性。
public class StatefulExample {
public int value { get; private set; }
public StatefulExample() { value = 1; }
//Example method that would need to be annotated
[Jetbrains.Annotations.PureAttribute]
public int negativeValue() { return -value; }
public static void useSpecificState(StatefulExample test) {
Contract.Requires(test.value == 1);
}
// ---
public static void pureMethodRequirementDemonstration() {
StatefulExample initialState = new StatefulExample();
useSpecificState(initialState);
StatefulExample possiblyChangedState = new StatefulExample();
//"Return value of Pure method is not used" here if annotated.
possiblyChangedState.negativeValue();
// "Requires unproven: test.value == 1" if NOT annotated.
useSpecificState(possiblyChangedState);
}
}