C#使类保持静态?
我有一门课是这样的:C#使类保持静态?,c#,interface,static,C#,Interface,Static,我有一门课是这样的: 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);
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
{
List idlist=new List();
公共整型加载(字符串路径)
{
//加载文件,提供内容,获取id
//...
int id=LoadFile(myfilecontent);
idlist.Add(id);
返回id;
}
公共空间处置()
{
//按id删除存储在idlist中的给定内容
foreach(idlist中的int id)
{
删除内容(id);
}
}
}
我想使它成为静态的,因为我只需要一个实例,并且可以从其他每个类访问函数,而不需要提供实例
我可以使其中的每个变量都是静态的,函数也是静态的
但我的问题是这是可识别的。我不能在静态类中有接口。最后我该怎么做?我的意思是,我可以删除该接口,但将函数保留在其中并使用我的主类,当我的主类被释放时,我调用ContentManager.Dispose()。但当我忘记了我的主要
你有解决这个问题的好办法吗?确保每次程序关闭时都调用Dispose
编辑:我将数据加载到图形卡中,并将指针取回来。当我的应用程序关闭时,我需要删除图形卡中的内容。为了安全起见,所有内容都被删除了,我使用dispose。我将把您的类作为非静态类,并实现singleton模式。我添加了一个示例,说明如何将其用作singleton:
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);
}
}
}
公共类ContentManager:IDisposable
{
私有列表idlist=新列表();
私有静态ContentManager实例;
私有内容管理器(){}
公共静态ContentManager实例
{
得到
{
if(实例==null)
{
instance=newcontentmanager();
}
返回实例;
}
}
公共整型加载(字符串路径)
{
int id=LoadFile(myfilecontent);
idlist.Add(id);
返回id;
}
公共空间处置()
{
foreach(idlist中的int id)
{
删除内容(id);
}
}
}
在这种情况下,为什么需要IDisposable接口?静态终结器和析构函数是不可能的,因为类型只有在AppDomain关闭时才被卸载,所以无论如何,您可以使用IDisposable这一事实将不会有用
如果您真的需要实现IDisposable,并且只想拥有一个类实例,那么使用单例模式可能是更好的解决方案
然后,您的类可以如下所示:
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);
}
}
}
类内容管理器:IDisposable
{
List idlist=new List();
静态ContentManager实例=null;
ContentManager()
{
}
公共静态ContentManager实例
{
得到
{
if(实例==null)
{
实例=新ContentManager();
}
返回实例;
}
}
公共整型加载(字符串路径)
{
//加载文件,提供内容,获取id
//...
int id=LoadFile(myfilecontent);
idlist.Add(id);
返回id;
}
公共空间处置()
{
//按id删除存储在idlist中的给定内容
foreach(idlist中的int id)
{
删除内容(id);
}
}
}
它不是线程安全的,但在您的场景中可能已经足够了 您不应该实现
IDisposable
。问题是,接口的目的是确保在实例超出范围时进行清理。没有实例,因此,IDisposable
实际上不适用
IDisposable
提供的主要功能是,如果您使用语句在中分配实例,编译器将为您添加dispose调用。同样,您不再有实例,因此它没有任何用途。相反,您应该拥有自己的dispose/clean方法并记录其用途。如果您认为这太容易出错(依赖文档显然不如让编译器/运行时强制执行某些内容理想),那么您可能希望遵循另一个答案中建议的单例模式。尝试将类转换为单例。您似乎在寻找单例: