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
接口?
答案 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.
}