0
public class MovieModel 
{
    public string id { get; set; }
    public string title { get; set; }
    public string image { get; set; }
    public string cnt { get; set; }        
}

public class DataSetHolder
{
    public DataSet Data = new DataSet();
    public Hashtable DataAdapters = new Hashtable();
    public SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);
}

我需要IDisposable为这两个类实现接口吗?

4

2 回答 2

1

您实施 IDispose
:因为您有需要释放的非托管资源(原始文件句柄等) - 这是一种非常罕见的情况。或
b。因为您想显式控制对托管对象控制的资源的访问生命周期。

也不是。或 b。适用于 MovieModel。它不包含访问您想要控制生命周期的资源的任何一次性对象。 不需要 IDisposable 实现

对于 DataSetHolder 一个。不适用,b。但是可能是因为它拥有一个管理资源(数据库连接)的 SqlConnection 对象。这是非常特殊的情况,因为该资源是池化的。您可以提供一个最小的 IDisposable 实现,并在您的 Dispose 中只释放连接(将其返回到连接池)。这将使 DataSetHolder 的用户能够手动处理它或使用“使用”块来控制连接的生命周期。

public class DataSetHolder : IDisposable {
    ...
    void Dispose() {
        if (connection!=null)
            connection.Dispose();
    }
}

然而,最好(参见此处)确保在 DataSetHolder 中使用连接时在完成时关闭它(即通过在 using 语句中包装 DataSetHolder 中连接的所有使用)。这样,您就不会不必要地使连接远离池。如果在每次使用时都以这种方式释放连接,则无需实现 IDispose(并且应用程序将更好地扩展)。

public class DataSetHolder {
    ...  
    void DoSomething() {
       using (connection) {
           ...
       }
    }

    void DoSomethingElse() {
       using (connection) {
           ...
       }
    }

    // No need for Dispose - the connection is disposed each time we use it.
}
于 2013-11-06T10:47:43.017 回答
1

您不需要为 MovieModel 实现 IDisposable。垃圾收集器会处理它。您可以为 DataSetHolder 实现 IDisposable。请阅读 MSDN 中的IDisposable文档,了解应如何以及何时使用 IDisposable。

该接口的主要用途是释放非托管资源。当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。但是,无法预测垃圾收集何时发生。此外,垃圾收集器不了解非托管资源,例如窗口句柄或打开的文件和流。

于 2013-11-05T09:44:36.603 回答