【问题标题】:How can TcpClient implement IDisposable and not have a public Dispose method?TcpClient 如何实现 IDisposable 而没有公共的 Dispose 方法?
【发布时间】:2011-01-20 11:58:12
【问题描述】:

正如标题所说:

TcpClient 怎么实现 IDisposable 而没有公共的 Dispose 方法?

【问题讨论】:

  • 当我使用智能感知来感受一个不熟悉的界面(我知道这可能很糟糕)时,这是我最讨厌的挫折之一,因为几乎没有迹象表明 using 语句是合适的。
  • 说到using,我这辈子从来没有遇到过局部一次性变量。我所有的一次性用品都是会员。所以我对所有using 的愤怒感到困惑。
  • @CannibalSmith: using 是一个替代,用于将它们保留为成员,用于真正仅与using 区域相关的事物。它的用途之一是打开数据库或网络连接,执行您需要执行的操作,然后自动关闭它。

标签: .net idisposable tcpclient


【解决方案1】:

通过使用explicit interface implementation。而不是

public void Dispose()
{
    ...
}

应该有

void IDisposable.Dispose()
{
    ...
}

其他各种类型都这样做;有时它是不必要的(例如支持IEnumerable.GetEnumerator 和IEnumerable<T>.GetEnumerator),而在其他时候它是在具体类型已知的情况下公开更合适的API。

【讨论】:

  • 那么在这种情况下,正确处理它的推荐方法是什么?通过显式将 Dispose() 方法转换为 IDisposable 或调用 TcpClient.Close() 来调用 Dispose() 方法?
  • @KFL:您可以只使用using 语句——这通常是最好的选择。如果你不能使用using 语句,调用Close 就可以了。
【解决方案2】:

见explicit interface implementation。您需要将TcpClient 的实例显式转换为IDisposable,或将其包装在using() {...} 块中。请注意,显式实现IDisposable 的类通常会提供公共Close() 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多