【问题标题】:.NET IDisposable use responsibilities, example SqlCommand.NET IDisposable 使用职责,示例 SqlCommand
【发布时间】:2018-01-16 18:34:58
【问题描述】:

MSDN 文档说“如果您的应用只使用一个实现 IDisposable 的对象,请不要提供 IDisposable 实现。相反,您应该在完成后调用该对象的 IDisposable.Dispose 实现使用它。”

您有义务查看多远的继承层次? 例如,SqlCommand 不实现 IDisposable;但是,它的父类 DBCommand 可以。 SqlCommand 上的 MSDN 文档示例不包含 Using 子句。

此外,根据 MSDN 文档 (IDisposable and the inheritance hierarchy),如果您从实现 IDisposable 的基础派生,则您有义务重写 Disposable。哪个 SqlCommand 显然可以(参见 referencesource.microsoft.com)。但它还包括“请注意,派生类自身不实现 IDisposable 接口,也不包括无参数的 Dispose 方法。”。

那么 SqlCommand “实现 IDisposable” 是在顶部第一个引用的文档中定义的,还是在上面引用的第二个中定义的?

近十年来,没有人改变 MSDN 的示例。

无论如何,这只是一个例子。再一次,我的问题是,一个人有义务在继承树上多远查看是否有实现 IDisposable 的东西?

(注意: 关于 SqlCommand 的具体问题在这里问(do we need using for the SqlCommand or is it enough just for the SqlConnection and SqlDataReader),但据我所知,我的一般问题还没有被问到)

【问题讨论】:

    标签: .net idisposable


    【解决方案1】:

    如果父类型 (DbCommand) 实现 IDisposable,则需要释放其继承的类型 (SqlCommand)。

    您可能误解了 MSDN 文档:

    “如果您的应用只是使用实现 IDisposable 的对象,请不要 提供 IDisposable 实现。相反,您应该调用 完成后对象的 IDisposable.Dispose 实现 使用它。”

    这不是指继承,而是指使用从其他地方获得的 IDisposable。

    【讨论】:

    • 不确定你的意思。我特别指的是使用从 IDisposable 派生的类。我认为它可能只是糟糕的 MSDN 文档。他们的其他 DbCommand 派生类的示例都没有包括在派生实例周围的“使用”。越想越需要使用。
    • 是的,如果您使用的类如 SqlCommand 派生自实现 IDisposable 的基类,是的,您仍然需要处置。
    • @user2457760 如果这不能回答您的问题,请随时澄清。对我来说,您的问题是关于是否处置从实现 IDisposable 的基类型继承的对象。答案是肯定的,你仍然需要处理那些派生类型。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2021-12-31
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多