2012-07-25 1 views
0

나는 패턴 것 같다 여러 경우에 명중했다 :코드 계약 컴파일러는 이것이 null 일 수 있다고 어떻게 생각합니까?

Contract.Ensures(Contract.Result<BlahType>() != null); 
... 
BlahType Blah = new BlahType(); 
... 
... 
return Blah; 

을하며 불만.

필드는 모두 비공개이며 메서드의 다른 부분은 아무 것도 사용하지 않습니다. (이것들은 모두 데이터가 디스크에서 가져와야하는 지연된 초기화입니다.)

물론 여기에 Contract.Assume을 추가 할 수 있지만 그 종류의 대답은 마음에 들지 않습니다.

+3

전체 (최소) 코드로 인해 문제가 발생합니까? –

+1

제공하신 코드로이 코드를 재현 할 수 없습니다.'Blah'를 수정하는 것이 있습니까? –

+0

다른 어떤 것도'return' 할 수 있습니까? –

답변

0

필드가 결코 null (또는 다른 조건)이 아닌 정적 검사기를 설득 할 수있는 유일한 방법은 불변성을 만드는 것입니다. invariant 메서드의 불변량은 클래스의 모든 메서드가 반환 될 때 검사되므로 검사자가 해당 메서드를 보유한다고 가정 할 수 있습니다. 그래서, 클래스의 맨 아래에 추가 :

#region Invariants 
[ContractInvariantMethod] 
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
    "CA1822:MarkMembersAsStatic", 
    Justification = "Required for code contracts.")] 
private void ObjectInvariant() 
{ 
    Contract.Invariant(this.blah != null); 
} 
#endregion 

참고 :

  • 불변의 방법이 적용되는 ContractInvariantMethod 속성이 인수없이 어떤 private void 방법이다. 거기에 여러 개의 불변성을 넣을 수 있습니다.
  • 신속 ObjectInvariant 방법 조각을 얻을 cimTABTAB을 입력합니다.
  • 기타 코드 계약 코드는 here입니다.
  • C#에서 개인/보호 필드 및 로컬 변수는 식별자의 첫 번째 문자가 소문자 (카멜 케이스)로 쓰여 있습니다. here for more information을 참조하십시오. 이렇게하면 코드를 더 읽기 쉽고 이해하기 쉬워집니다.
+0

개체간에 나는 당신과 동의 할 것이지만 이것은 방법 내에 있습니다. 정적 검사기가 일상적인 호출이 그걸로 엉망이 될 수 있다는 것을 알 수 없다고 말하는 겁니까? –

+0

당신은 (사적인) 들판에 대해 이야기하고 있었으므로, 이것이 내가 들판을 위해 생각해 낼 수있는 것입니다. 그러나 당신은 분명히 전혀 다른 지역 변수에 대해 말하고있는 것입니다. 문제를 나타낼 수있는 더 많은 코드/컨텍스트를 게시물에 추가 할 수 있습니까? 표시된 코드를 사용하여 문제를 재현 할 수 없습니다. 내 정적 검사기가 불평하지 않습니다. – Virtlink

+0

메소드가 'this.blah'에 액세스 할 때 CA1822를 억제해야하는 이유를 설명 할 수 있습니까? 나도이 문제를 겪었지만 그 이유는 알지 못한다. – Ergwun