实现IDisposable接口

时间:2013-11-05 09:37:08

标签: idisposable

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接口?

2 个答案:

答案 0 :(得分:1)

您无需为MovieModel实现IDisposable。垃圾收集器会处理它。您可以为DataSetHolder实现IDisposable。请阅读MSDN中的IDisposable文档,了解IDisposable的使用方式和时间。

  

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

答案 1 :(得分:1)

您实现IDispose:
一个。因为您需要释放非托管资源(原始文件句柄等) - 这是一种非常罕见的情况。 OR
湾因为您希望显式控制受管理对象控制的资源的访问生存期。

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

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

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

这可能不过(see here)是只是为了更好地保证内完成DataSetHolder时当过您使用的连接,然后将其关闭(即通过包装在using语句内DataSetHolder连接的所有使用率)。这样你就不会不必要地连接游泳池了。如果在每次使用时都以这种方式释放连接,那么就不需要实现IDispose(并且app会更好地扩展)。

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

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

    // No need for Dispose - the connection is disposed each time we use it.
}