2014-03-02 2 views
9

.NET 4.0 용 ReSharper 8.0 및 VS2012를 사용하여 C#으로 작성했습니다.Resharper와 코드 계약 둘 다 사용할 수있는 공통 PureAttribute가 있습니까?

ReSharper는 JetBrains.Annotations.PureAttribute 속성을 포함합니다. 이것은 "Pure 메서드의 반환 값이 사용되지 않음"이라는 검사를 제공하는 데 사용됩니다.

코드 계약에는 System.Diagnostics.Contracts.PureAttribute 속성이 포함되어 있습니다. 이것은 코드 계약 검사에서 호출에 가시적 인 상태 변경이 발생하지 않도록하기 위해 사용되므로 오브젝트의 상태를 다시 확인하지 않아도됩니다.

현재이 두 도구의 기능을 모두 사용하려면 메서드에서 각각의 특성으로 주석을 추가해야합니다. 더 나쁜 것은 둘 다 동일한 유형 이름을 공유하기 때문에 각 속성을 한정해야합니다.

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

는 세 가지 방법이 있어야한다,이 상황을 방지하려면 :

  1. 모두 ReSharper에서 인식 할 수있는 자리를 작성하고
  2. 이 계약은
  3. 가 계약을받을 속성을 인식 할 수 ReSharper에서 얻을 계약합니다 ReSharper 특성을 인식하십시오.

이 중 하나가 가능합니까?

답변

4

ReSharper에서 이미 System.Diagnostics.Contracts.PureAttribute을 이해하고 JetBrains.Annotations.PureAttribute로 같은 방법으로 취급, 그래서 당신은 단지 코드 계약에서 하나를 사용할 수 있으며, 두 도구는 행복 할 것이다.

+2

'System.Diagnostics.Contracts.PureAttribute'는'[Conditional ("CONTRACTS_FULL")]'로 정의됩니다. 즉, 전체 런타임 계약 검사를 통해 빌드하지 않는 한 ReSharper에 표시되지 않습니다. 이는 항상 바람직한 것은 아닙니다. – Varon

+0

아, 잘 찾아 냈습니다. 이것은 ReSharper가 컴파일시에'CONTRACTS_FULL'이 정의되어 있지 않으면 컴파일 된 메소드에서'PureAttribute'를 볼 수 없다는 것을 의미합니다. 그러나 ReSharper는 여전히 소스 코드에서이를 볼 수 있습니다. ReSharper는 조건부 설정이 아닌 속성의 이름 만 봅니다. – citizenmatt

+0

R # 9.2가'System.Diagnostics.Contracts.PureAttribute'를 해석하는 방법을 잊어 버린 것 같습니다 :) – porges

2

접근법 3은 솔루션을 제공합니다 : Jetbrains.Annotations.PureAttribute은 계약에 의해 인정됩니다.

그러나 코드에서 계약 및 PureAttribute를 사용할 때 이름 충돌 문제가 발생합니다. 다음 문을 사용하여 축약 될 수 있습니다. 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); 
    } 

}