2010-06-03 82 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(布尔处置)方法。