밀접한 방법으로 패턴을 처리하는 방법을 올바르게 구현하는 방법 (CA1063)

StackOverflow https://stackoverflow.com/questions/630955

  •  08-07-2019
  •  | 
  •  

문제

프레임 워크 설계 가이드 라인 (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 플래그를 조건부 컴파일 기호로 지정할 때만 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top