对于模糊的标题很抱歉,但我不确定这是什么称呼。选择显式实现接口时生成的Visual Studio代码
假设我将IDisposable
添加到我的类中,Visual Studio可以为我创建方法存根。但是它会建立像存根:
void IDisposable.Dispose()
我不明白这是什么语法做。为什么它会这样而不是public void Dispose()
?
第一种语法,我无法解决如何从我的类(在我的析构函数)调用Dispose()。
对于模糊的标题很抱歉,但我不确定这是什么称呼。选择显式实现接口时生成的Visual Studio代码
假设我将IDisposable
添加到我的类中,Visual Studio可以为我创建方法存根。但是它会建立像存根:
void IDisposable.Dispose()
我不明白这是什么语法做。为什么它会这样而不是public void Dispose()
?
第一种语法,我无法解决如何从我的类(在我的析构函数)调用Dispose()。
当你明确地实现一个接口成员,这是生成的代码在做什么时,你不能通过类实例访问成员。相反,您必须通过接口的实例调用它。例如:
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"
}
的Visual Studio给你两个选择:
你通常会选择第一个(非明确):这给你你想要的行为。
如果您从两个不同的接口(即多重继承(通常不会))继承相同的方法,则“显式”选项很有用。
接口类型的成员始终是公共的。这要求他们的方法实施也是公开的。这并不编译例如:
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(布尔处置)方法。