簡體   English   中英

C#make class static?

[英]C# make class 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。

我會把你的類留作非靜態類並實現單例模式。 我添加了一個如何將其用作單例的示例:

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

你應該不實現IDisposable 問題是,接口的目的是確保在實例超出范圍時進行清理。 沒有實例,因此IDisposable並不真正適用。

IDisposable為您提供的主要功能是,如果您在using語句中分配實例,則編譯器會為您添加dispose調用。 同樣,您不再擁有實例,因此它沒有任何意義。 相反,你應該有自己的處理/清理方法並記錄它的目的。 如果您認為這太容易出錯(依賴於文檔顯然不如編譯器/運行時強制執行某些操作那么理想),那么您可能希望按照另一個答案中的建議遵循單例模式。

在這種情況下,為什么需要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);
            }
        }
 }

它不是線程安全的,但在您的場景中可能就足夠了。

嘗試將您的班級變成單身人士。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM