我有一个这样的课程:
class ContentManager : IDisposable
{
List<int> idlist = new List<int>();
public int Load(string path)
{
//Load file, give content, gets an id
//...
int id = LoadFile(myfilecontent);
idlist.Add(id);
return id;
}
public void Dispose()
{
//Delete the given content by id, stored in idlist
foreach(int id in idlist)
{
DeleteContent(id);
}
}
}
我想让它成为静态的,因为我只需要一个实例,并且可以在不提供实例的情况下从其他所有类访问该函数。
我可以使其中的每个变量都是静态的,函数是静态的。
但我的问题是这个IDisposable。我不能在静态类中使用接口。我怎么能在最后做一些动作?我的意思是我可以删除该接口,但将函数保留在其中并使用我的主类,当我的主类被释放时,我调用ContentManager.Dispose()。但是,当我忘记在我的主...
你有一个很好的解决方案吗?确保每次程序关闭时都调用Dispose?
编辑:我在图形卡中加载数据并返回指针。当我的应用程序关闭时,我需要从显卡中删除内容。为了安全起见,一切都被删除了,我使用了dispose。
答案 0 :(得分:7)
我会把你的类留作非静态类并实现单例模式。我添加了一个如何将其用作单例的示例:
public class ContentManager : IDisposable
{
private List<int> idlist = new List<int>();
private static ContentManager instance;
private ContentManager () {}
public static ContentManager Instance
{
get
{
if (instance == null)
{
instance = new ContentManager ();
}
return instance;
}
}
public int Load(string path)
{
int id = LoadFile(myfilecontent);
idlist.Add(id);
return id;
}
public void Dispose()
{
foreach(int id in idlist)
{
DeleteContent(id);
}
}
}
答案 1 :(得分:3)
您应该不实施IDisposable
。问题是,接口的目的是确保在实例超出范围时进行清理。没有实例,因此IDisposable
并不真正适用。
IDisposable
给你的主要内容是,如果你在using
语句中分配实例,编译器会为你添加一个dispose调用。同样,您不再拥有实例,因此它没有任何意义。相反,你应该有自己的处理/清理方法并记录它的目的。如果您认为这太容易出错(依赖于文档显然不如编译器/运行时强制执行某些操作那么理想),那么您可能希望按照另一个答案中的建议遵循单例模式。
答案 2 :(得分:2)
在这种情况下,为什么需要IDisposable接口?静态终结器和析构函数是不可能的,因为只有当AppDomain关闭时才会卸载类型,所以无论如何你可以使用IDisposable都没用。
如果你真的需要实现IDisposable并希望只有一个类的实例,那么使用Singleton模式是一个更好的解决方案吗?
您的课程可能如下所示:
class ContentManager : IDisposable
{
List<int> idlist = new List<int>();
static ContentManager instance=null;
ContentManager()
{
}
public static ContentManager Instance
{
get
{
if (instance==null)
{
instance = new ContentManager();
}
return instance;
}
}
public int Load(string path)
{
//Load file, give content, gets an id
//...
int id = LoadFile(myfilecontent);
idlist.Add(id);
return id;
}
public void Dispose()
{
//Delete the given content by id, stored in idlist
foreach (int id in idlist)
{
DeleteContent(id);
}
}
}
它不是线程安全的,但在您的场景中可能已经足够了。
答案 3 :(得分:1)
尝试将您的班级变成单身人士。