밀접한 방법으로 패턴을 처리하는 방법을 올바르게 구현하는 방법 (CA1063)
문제
프레임 워크 설계 가이드 라인 (2nd ed., Page 327)은 다음과 같이 말합니다.
방법을 제공하는 것을 고려하십시오
Close()
, 여기에 덧붙여Dispose()
,이 지역의 표준 용어 인 경우.그렇게 할 때 면밀한 구현을 동일하게 만드는 것이 중요합니다.
Dispose
그리고 구현을 고려하십시오IDisposable.Dispose
명시 적으로 방법.
따라서 제공된 예제에 따라이 수업이 있습니다.
public class SomeClass : IDisposable {
private SomeDisposable someInnerDisposable;
public void Open() {
this.someInnerDisposable = new SomeDisposable();
}
void IDisposable.Dispose() {
this.Close();
}
public void Close() {
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
this.someInnerDisposable.Dispose();
this.someInnerDisposable = null;
}
}
}
fxcop은 그것을 좋아하지 않는 것 같습니다.
CA1816 : Microsoft.usage : 'someclass.close ()' 'gc.suppressfinalize (object)'호출, 일반적으로 'idisposable.dispose'의 구현 내에서만 호출되는 방법입니다. 자세한 내용은 idisposable 패턴을 참조하십시오.
CA1816 : Microsoft.usage : 'someclass.idisposable.dispose ()' 'gc.suppressfinalize (object)'를 변경하십시오. 이렇게하면 객체가 폐기되고 범위가 떨어지면 객체의 불필요한 완료를 방지합니다.
CA1063 : Microsoft.Design : 'someclass.idisposable.dispose ()'를 수정하여 dispose (true)를 호출 한 다음 gc.suppressfinalize ( 'this'또는 'me'에서 gc.suppressfinalize를 호출하고, 그런 다음, 그 다음에 gc.suppressfinalize를 호출합니다. 보고.
CA1063 : Microsoft.Design : 'SomeClass.idisposable.dispose ()' ''relpose '로 선언되어 공개되어 봉인 된지 확인하십시오.
- 가까운 방법으로 처분 패턴을 올바르게 구현하려면 어떻게합니까?
-또는-
- 경고를 어떻게 억제합니까?
나는 시도했다
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
그러나 FXCOP 1.36은 여전히보고합니다.
편집하다: 제안 된대로 주변을 변경하면이 경고를 제외한 모든 경고가 제거됩니다.
CA1063 : Microsoft.Design : 'SomeClass.idisposable.dispose ()' ''relpose '로 선언되어 공개되어 봉인 된지 확인하십시오.
편집 2: code_analysis가 실제로 누락되었습니다. 감사.
해결책
주위를 바꾸십시오.
close ()에게 전화를 걸고 dispose ()를하고 close () 메소드 대신 dispose () 메소드에 논리를 넣으십시오.
-------------------- 편집 후 추가 정보 ----------------
또한 선언을 다음으로 변경합니다.
public void Dispose()
다른 오류를 제거해야합니다. 당신은 그것을 다음과 같이 선언했기 때문에 :
void IDisposable.Dispose()
공개적으로 표시되지 않고 봉인되지 않았으며 FXCOP는 불만을 제기합니다. 개인적으로, 나는 오류를 억제하는 대신 오류를 피하는 것을 선호합니다.
다른 팁
경고를 어떻게 억제합니까?
suppressmessage ()는 code_analysis 플래그를 조건부 컴파일 기호로 지정할 때만 작동합니다.