我在我的課程中只有一個副本。我不想使用Singleton模式,原因有很多(*見下文)。我知道我只會有一個類的副本,因爲我將是唯一一個調用它的構造函數。這是一個很好的方法來檢查是否只有一個類的實例存在,而不訴諸使用Singleton模式?
在我的類的構造函數中,我想檢查該類的只有一個副本是否存在,並在存在多個類時拋出異常。下面的代碼是否適合用於這種情況?
public class MySingletonAlternative : IDisposable
{
private static int _count = 0;
public MySingletonAlternative()
{
int newValue = System.Threading.Interlocked.Increment(ref _count);
if (newValue > 1)
{
throw new NotImplementedException();
}
}
public void Dispose()
{
int newValue = System.Threading.Interlocked.Decrement(ref _count);
if (newValue < 0)
{
throw new ObjectDisposedException("MySingletonAlternative");
}
}
}
*我爲什麼不想使用單例:
我希望能夠創建該類時控制。在傳統的C#單例模式中,構造發生非確定性。
我想避免全局變量。
當我調試我的代碼並在Singleton的私有構造函數中引發異常時,Visual Studio會突出顯示該異常,但它會突出顯示錯誤的代碼行,通常位於不同的文件中。
我不想懶惰地創建這個對象(使用Lazy <T>)。這個類的一個實例將存在於我的應用程序的生命中。我通過懶惰地構建它而獲益匪淺。
如果你有一個靜態構造函數,正常單的建設是完全確定的。而你仍然有一個全局變量:計數器。一點也不清楚*爲什麼*要阻止創建多個實例。這有一些單身模式的缺點(例如缺乏可測試性),沒有一些可疑的好處。 –
根據http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx用戶無法控制何時在程序中執行靜態構造函數。另外,我不會將全局計數器考慮到我宣佈它是私密的。 – user2023861
這只是不真實的。對於沒有存在靜態構造函數的類型,它的類型初始值設定項有些* true,但是當存在靜態構造函數時,C#規範非常明確:「執行靜態構造函數是由以下事件中的第一個觸發的:應用程序域: - \t創建類類型的實例 - 引用任何類類型的靜態成員。「 –