[英]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.