문제

나는 최근에 구현한 클래스를 다음과 같:

class TestClass : IDisposable
{
    RegistryKey m_key;
    public TestClass()
    {
        m_key = Registry.CurrentUser.OpenSubKey("Software", false);
    }

    public void Dispose()
    {
        // m_key.Dispose();
        IDisposable disp = m_key;
        disp.Dispose();
    }
}

면 나는 주석에 직접 전화 처분,나는 오류 CS0117("'Microsoft.Win32.때'정의가 포함되어 있지 않에 대한'처'").일부를 인터넷 검색도 이 스레드, 내가 배운 것은 무엇이었고,그래서 내가 지금의 역학을 이해하는니다.이 MSDN 문서는 저자가 선호하는 Close()를 호출신의 처분(),지 그 이유를 설명한다.

의 목적이 무엇이턴(는 생각에 그것을 본 적 IO 클래스뿐만 아니라)?사실에는 이것은 의도적인 의사 결정 클래스에 의해 저자는 어떻게 나쁜 것은 위의 코드(호출을 처분을 통해 IDisposable 인터페이스)?할 수 없습니다 너무 나쁜 후에도,그것은에서 무슨 일이 일어날 것을 사용하여 문을,오른쪽?

[편집:1)제목 변경에서는'비공하는"명시적인"2)제거되는 명시적 구현에서 내 코드 실수로,왼쪽에 실험에서]

도움이 되었습니까?

해결책

명시적 인터페이스 구현.에서 당신의 예 때문에 당신의 처분()메소드로는"무효 IDisposable.폐기()"당신이 명시적으로 구현하 IDisposable 인터페이스 뿐만 아니라.

이것은 일반적으로 수행하여 충돌을 피할 수 있습니다.마이크로소프트가고 싶어하는 추가 또 다른 처분()메소드는 다른 뭔가를했을때 그들은 할 수 없지 않는 한 그들이 사용하는 명시적으로 구현하는 인터페이스입니다.

이는 자주 수행과 일반적인 폐쇄<T> 인터페이스입니다.그것은 당신이 또한 구현 non-일반 인터페이스페.다만 회원에 이러한 두 인터페이스 GetEnumerator 으로,일반적인 중 하나되고 더 유용하고,그래서 일반적으로 구현되는 다음과 같다:

public clas SomeClass : IEnumerable<SomeOtherClass>
{
    public IEnumerator<SomeOtherClass> GetEnumerator ()
    {
        ...
    }

    IEnumerator IEnumerable.GetEnumerator ()
    {
        return GetEnumerator ();
    }
}

이 방법으로 호출할 때는 객체의 SomeClass 의 GetEnumator 방법,그것은 일반 버전 이후,다른 하나는 명시적으로 구현할 수 있도록,우리를 얻을 강력-입력 generics 수 있습니다.

페이지를 참조하십시오 166-169 의 프로그래밍 C# 에 의해 제시티(나는 네 번째 버전)입니다.

다른 팁

대부분의 사람들이 동의하지 않지만, 나는 다음과 같를 사용하여 명시적 인터페이스 구현 모든 인터페이스.난 명확하게 하고 싶지 여부를 하는데 방법을하고 바른 길에서 벗어나는 자체 또는 내 인터페이스입니다.

이것은 고통이 있는 경우 객체에 대한 참조하고 전화 인터페이스 방식(위와 같이 예)하지만,나는 그것을 완화에 의해 쓰기:

class C : IDisposable
{
    public IDisposable IDisposable { get { return this; } }
    void IDisposable.Dispose() { }
}

는 것을 의미를 호출하는 방법에 대 C 처럼 보인:

C c = ...
c.IDisposable.Dispose();

컴파일러 구문으로 이것을"전화 IDisposable 속 C,다음 Dispose() 방법 결과에"그러나 나는 그것을 읽으로"전화 IDisposable.Dispose() 방법 C"보이는 자연적인 여기에.

이 접근 방식을 얻을 수 있습 추한 사용할 때 일반 인터페이스도해 보시기 바랍니다.

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