【问题标题】:If my class has a SqlConnection (or other disposable) member, should it implement IDisposable? [duplicate]如果我的班级有一个 SqlConnection(或其他一次性)成员,它应该实现 IDisposable 吗? [复制]
【发布时间】:2016-04-26 13:35:58
【问题描述】:

这是应该遵循的正确模式吗,即如果我的班级有一次性成员,我必须明确地在每个成员上调用 Dipose()

class MyClass : IDisposable
{
 public MyClass()
 {
  conn = maybeCreateAConnection();
 }
 public void Dispose()
 {
  if(conn!=null)conn.Dispose();
 }

 private SqlConnection conn;
}

【问题讨论】:

  • Dispose Pattern, first DO - “DO 在包含一次性类型实例的类型上实现基本 Dispose 模式”
  • 我会质疑为什么您需要一个成员来进行连接 - 应该快速创建、使用和处理连接。很少有令人信服的理由让连接在课程期间保持活跃。
  • @Damien_The_Unbeliever 看起来很笨拙,更像是 C++ 必须记住哪些字段是一次性的!
  • 通常这并不重要 - 连接是池化的,如果您正确释放旧连接,则从池中获取新连接相当简单(基本上只是一个重置)。跨度>
  • @Mr.Boy - 保持连接 string,而不是连接 object

标签: c# garbage-collection dispose


【解决方案1】:

是的。但前提是类是所述资源的所有者。您不想丢弃其他人正在使用的连接。

顺便说一句,这与垃圾收集器无关。

【讨论】:

  • 怎么回事?如果您愿意,请删除标签,尽管它看起来像是一个骗子。
  • @Mr.Boy Dispose 只是一个和其他方法一样的方法,它与垃圾收集器无关。 GC 只关心引用和终结器。终结器可能调用Dispose方法,但这无关紧要——它也可以调用任何其他方法,只要它是安全的。
  • 垃圾收集器是 .NET 拥有 IDisposable 的原因。如果我们没有管理内存并手动释放所有资源,则不需要IDisposable - 它只会进入析构函数(终结器)。
  • @Dstanley 不,不是真的。它只是一个方便的通用接口,用于处理非托管资源,这就是它的全部设计目的。终结器几乎总是会调用Dispose 方法,但这无关紧要。 IDisposable 接口也常用于处理托管资源(感谢方便的using 语法),但这不是它的用途。
  • 我不确定它是否应该只在类是 owner 时才处理它。有一个 BinaryReader(也是 BinaryWriter)接受一个流。你没有机会告诉它不应该拥有所有权,但它确实如此。在它的 Dispose 中,它也会处理底层流,你无法避免它。我同意你应该有一个明确的所有权,并且所有者必须处理它,但是 .Net Framework 中有一些示例违反了该规则。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多