【问题标题】:What does IDisposable.Dispose() as a method name mean?IDisposable.Dispose() 作为方法名称是什么意思?
【发布时间】:2012-01-05 13:05:18
【问题描述】:

我正在整理一些代码,在课堂上发现了这个区域:

    #region IDisposable Members

        void IDisposable.Dispose()
        {
        } 

     #endregion

现在了解这是为 IDisposable 接口实现 Dispose 方法,并且我知道类声明说该类将实现 IDisposable 接口。

我不明白为什么会这样写:

void IDisposable.Dispose()

而不是:

public void Dispose()

我猜 IDisposable.Dispose 明确指出这是实现 IDisposable 接口的 Dispose?这是正确的吗?这样做有什么好处?

【问题讨论】:

  • 您应该阅读有关 C# 中接口的显式和隐式实现的信息,请参阅 - stackoverflow.com/questions/143405/…
  • 哇,这实际上提供了比 Microsoft 文章更多的信息!你应该把你的评论作为答案!
  • 我同意@AidanO - 将其发布为答案。
  • 我试过了,但是把它变成了评论。不过,随心所欲地投票吧:D

标签: c# methods interface declaration


【解决方案1】:

这是一个explicit interface implementation

这意味着只有IDisposable类型的变量才能在这个类上调用Dispose

这样做会“隐藏”Dispose 与类类型变量一起使用的方法 - 如果不先转换为 IDisposable,它将无法直接调用它。实施者可能是故意这样做的。

此外,如果该类要实现自己的Dispose(或从还定义Dispose 方法的类/接口继承/实现),这将允许存在多个实现。

【讨论】:

  • 但是为什么这里可能是个好主意呢?试试 Dispose Pattern 文档(可能是在 #code-snippet-7 之前的 msdn.microsoft.com/en-us/library/b1yfkh5e.aspx,但这些链接似乎比我们树上的苹果腐烂得更快):如果“自然”处理方法名称是 Close (至于File),你希望你的用户这样做,所以你要确保他们只能通过IDisposable 使用Dispose——至少我是这么读的:“这样做时,重要的是你使 Close 实现与 Dispose 相同,并考虑显式实现 IDisposable.Dispose 方法。” …
  • ……但我怀疑IDisposable.Dispose() 的许多显式实现是误解或复制和节奏狂奔。
【解决方案2】:

那是explicit interface implementation。如果一个类实现了多个具有相同方法的接口,则很有用。

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2010-11-23
    相关资源
    最近更新 更多