【问题标题】:Why does the .NET BCL class ClientBase EXPLICITLY implement IDispose [duplicate]为什么 .NET BCL 类 ClientBase 明确实现 IDispose [重复]
【发布时间】:2015-11-24 11:27:55
【问题描述】:

我知道ClientBase<T> 类显式实现了IDisposable 接口,但是我不明白为什么要显式完成。 ClientBase doesn't implement IDisposable member

如果 MyClient 派生自 ClientBase<T> 我不能以这种方式明确地 Dispose 对象:

MyClient client = new MyClient();
client.Dispose();

除非我强制转换为底层接口或使用using 语句设计模式实现对象生命周期:

((IDisposable)client).Dispose();

微软可以通过显式接口实现将 Dispose 方法隐藏在此类上,而微软可以将其公开并允许开发人员显式调用它,这有什么好处?

它不像ClientBase<T> 类正在实现两个不同的接口,但方法声明相互冲突,因此我认为在这种情况下不需要显式接口实现,除非我错过了什么............

【问题讨论】:

  • 这可能是实现ClientBase<T> 的人的设计选择。 found here. 详细介绍了隐式和显式接口实现
  • (虽然我将其标记为重复的问题侧重于不同的课程,但它是相同的一般问题,并且接受的答案涵盖了一般设计原则)。

标签: c# dispose using-statement explicit-interface


【解决方案1】:

这就是微软以这种方式实现它的原因,他们还建议我们在相同的情况下也这样做。这意味着您应该调用公共 Close 方法,它的行为与 Dispose 完全相同。

IDisposable

考虑提供方法 Close(),除了 Dispose(),如果 close 是该领域的标准术语。 这样做时,务必使 Close 实现与 Dispose 相同,并考虑显式实现 IDisposable.Dispose 方法。

【讨论】:

  • 对不起,我在回答时不知道重复。您可以取消标记。
【解决方案2】:

在最初几年或 .NET 中,由于可发现性,Close 优于 Dispose 流。如果您打开一个流,则认为寻找 Close 方法而不是 Dispose 更容易。

http://blogs.msdn.com/b/kimhamil/archive/2008/03/15/the-often-non-difference-between-close-and-dispose.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2012-01-03
    • 2011-02-12
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多