2010-06-03 42 views
1

對於模糊的標題很抱歉,但我不確定這是什麼稱呼。選擇顯式實現接口時生成的Visual Studio代碼

假設我將IDisposable添加到我的類中,Visual Studio可以爲我創建方法存根。但是它會建立像存根:

void IDisposable.Dispose()

我不明白這是什麼語法做。爲什麼它會這樣而不是public void Dispose()

第一種語法,我無法解決如何從我的類(在我的析構函數)調用Dispose()。

回答

2

當你明確地實現一個接口成員,這是生成的代碼在做什麼時,你不能通過類實例訪問成員。相反,您必須通過接口的實例調用它。例如:

class MyClass : IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
    // Do Stuff 
    } 

    ~MyClass() 
    { 
    IDisposable me = (IDisposable)this; 
    me.Dispose(); 
    } 
} 

這使您能夠實現兩個接口具有相同名稱的成員,並明確單獨調用任何一名成員。

interface IExplict1 
{ 
    string InterfaceName(); 
} 

interface IExplict2 
{ 
    string InterfaceName(); 
} 

class MyClass : IExplict1, IExplict2 
{ 
    string IExplict1.InterfaceName() 
    { 
    return "IExplicit1"; 
    } 

    string IExplict2.InterfaceName() 
    { 
    return "IExplicit2"; 
    } 
} 

public static void Main() 
{ 
    MyClass myInstance = new MyClass(); 

    Console.WriteLine(((IExplcit1)myInstance).InstanceName()); // outputs "IExplicit1" 

    IExplicit2 myExplicit2Instance = (IExplicit2)myInstance; 

    Console.WriteLine(myExplicit2Instance.InstanceName()); // outputs "IExplicit2" 
} 
1

的Visual Studio給你兩個選擇:

  • 實施
  • 實施明確

你通常會選擇第一個(非明確):這給你你想要的行爲。

如果您從兩個不同的接口(即多重繼承(通常不會))繼承相同的方法,則「顯式」選項很有用。

1

接口類型的成員始終是公共的。這要求他們的方法實施也是公開的。這並不編譯例如:

interface IFoo { void Bar(); } 

class Baz : IFoo { 
    private void Bar() { } // CS0737 
} 

顯式接口實現提供一種語法,允許該方法是私有的:

class Baz : IFoo { 
    void IFoo.Bar() { } // No error 
} 

經典使用的,這是隱藏一個基本接口的實現類型。 IEnumerable的<>將是一個很好的例子:

class Baz : IEnumerable<Foo> { 
    public IEnumerator<Foo> GetEnumerator() {} 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { } 
} 

注通用版本是如何訪問,非通用版本是隱藏的。這兩者都不鼓勵使用它,並且避免了由於重複方法而導致的編譯錯誤。


在你的情況下,顯式實現Dispose()是錯誤的。您編寫Dispose()以允許客戶端代碼調用它,迫使它轉換爲IDisposable以使調用無效。

此外,從終結器調用Dispose()是一種代碼異味。標準模式是爲您的課程添加受保護的Dispose(布爾處置)方法。