C#make class static?

时间:2014-01-23 20:52:36

标签: 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);

        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。

4 个答案:

答案 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)

尝试将您的班级变成单身人士。