【问题标题】:C# make class static?C#使类静态?
【发布时间】:2014-01-24 06:30:30
【问题描述】:

我有这样的课:

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。

【问题讨论】:

标签: c# interface static


【解决方案1】:

我会将您的类保留为非静态类并实现单例模式。我添加了一个如何将其用作单例的示例:

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);
        }
    }
}

【讨论】:

    【解决方案2】:

    你不应该实现IDisposable。问题是,接口的目的是确保在实例超出范围时完成清理。没有实例,因此IDisposable 并不真正适用。

    IDisposable 为您提供的主要内容是,如果您在 using 语句中分配实例,编译器会为您添加 dispose 调用。同样,您不再有实例,因此它没有目的。相反,您应该只拥有自己的处置/清理方法并记录其目的。如果您认为这太容易出错(依赖文档显然不如让编译器/运行时强制执行某些操作),那么您可能希望遵循另一个答案中建议的单例模式。

    【讨论】:

      【解决方案3】:

      在这种情况下,为什么需要 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);
                  }
              }
       }
      

      它不是线程安全的,但在您的场景中可能就足够了。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 2020-08-06
          • 2011-09-11
          • 2010-09-26
          • 1970-01-01
          相关资源
          最近更新 更多