是否存在Resharper和Code Contracts都可以使用的常见PureAttribute?

时间:2014-03-02 16:54:15

标签: c# resharper custom-attributes code-contracts

我正在用C#编写ReSharper 8.0和VS2012 for .Net 4.0。

ReSharper包含一个属性:JetBrains.Annotations.PureAttribute。这用于提供检查“不使用纯方法的返回值”。

代码合同包含一个属性:System.Diagnostics.Contracts.PureAttribute。代码合同检查使用它来确保调用不会产生可见的状态更改,因此不需要重新检查对象的状态。

目前,要获得这两种工具的功能,需要使用每种方法的属性对方法进行注释。更糟糕的是,因为它们都具有相同的类型名称,所以您需要对每个属性进行限定。

[Pure]
[Jetbrains.Annotations.Pure]
public bool isFinished() {
    ...

为避免这种情况,应该有三种方法:

  1. 写一个由ReSharper和Contracts识别的占位符
  2. 让ReSharper识别合同属性
  3. 获取合同以识别ReSharper属性
  4. 这些都有可能吗?

2 个答案:

答案 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);
    }

}