Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使类保持静态?_C#_Interface_Static - Fatal编程技术网

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方法并记录其用途。如果您认为这太容易出错(依赖文档显然不如让编译器/运行时强制执行某些内容理想),那么您可能希望遵循另一个答案中建议的单例模式。

尝试将类转换为单例。

您似乎在寻找单例: