回答
標記構造函數private
。當然,這並不妨礙類通過static
方法實例化自己,例如...
更實際的是,不允許類實例化的目的是什麼。如果它有一個單身人士,那麼private
構造函數是適當的。如果要強制子類化,則使類abstract
更好;如果是有實用方法的課程,則使其成爲static
是一種方法(那麼您只能擁有static
方法)。
我做到了,但它不工作仍然可以創建obj。 – 2012-04-13 12:52:24
@RomeshSomani它取決於你試圖從哪裏創建實例。它需要完全否認它,使其變得抽象。編輯 - 對不起,我的意思是靜態的。 – asawyer 2012-04-13 12:53:12
不,抽象的目的不同。使其靜態。 – 2012-04-13 12:54:37
I need to know how to prevent a class from being Instantiated in .net?
你的問題不明確。
你的意思是在運行時實例化嗎?製作課程abstract
或static
。
你的意思是說構造函數在代碼中是不可訪問的嗎?使構造函數private
。但請注意,有人仍然可以使用反射來獲取構造函數的句柄並在運行時實例化一個實例。
那麼,你的意思是?
使類靜態是最好的辦法,如果你絕對不想要任何實例。這會阻止任何人從創建實例。該課程將被密封和摘要,並且不會有任何構造函數。
此外,該語言會注意到它是一個靜態類,並阻止您在各個地方使用它,其中意味着實例,例如,類型參數和變量。這比僅僅使用私有構造函數更清楚地表明意圖 - 這可能意味着在該類中創建了實例(例如,用於單例實現)。
哦,使得類的靜態將阻止你在課堂上引入任何無謂的實例成員,太:)
有關靜態類的詳細信息,請參閱MSDN。
關於靜態類的好奇,他們不[看起來像類](http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html);他們更類似於模塊... – 2012-04-13 13:03:47
如果問題是:
How can you make your class not be instanced without having your class be
static
orabstract
?
那麼這個問題的答案是落實singleton pattern,這英寸
public sealed class myClass
{
private static readonly Lazy<myClass> lazyInstance =
new Lazy<myClass>(() => new myClass());
public static Instance
{
get
{
return lazyInstance.Value;
}
}
private myClass()
{
// constructor logic here
}
}
單例模式允許你通過周圍類爲方法的參考,同時還要確保你只有你的類的一個實例:NET 4+這與輕鬆完成。它還使得測試更容易,因爲您可以使用myClass
實現的ImyClass
實例,這在製作模擬對象時非常有用。
沒有.NET4你仍然可以實現單件模式,例如:
private static readonly myClass instance = new myClass();
public static Instance
{
get
{
return instance;
}
}
// rest of code remains the same
不具有延遲加載,直到它的名字,還有很多其他的方法,以及(我想大約6種不同的方式),但以上兩種是最常見的。
總之,問題可能是詢問你是否知道單例模式,以及是否認識到它對於單元測試和模擬對象的靜態類的重要性。
正如其他人已經指出的那樣,static
字段,甚至那些標記爲readonly
的字段都可以設置反射,另外private
構造函數可以使用反射來調用。如果您需要防止這些問題發生,您可能需要將調用代碼放在信任度較低的應用程序域空間中,否則您需要將您的類實現爲static
。儘管如此,人們並不打擾這樣的反思層次來繞過你的約束,除非他們'真的需要'例如編寫模糊/極端條紋的單元測試。
- 1. Singleton - 實例化類的最佳方式
- 2. 防止多個服務實例 - 最佳方法?
- 3. 最佳實踐:類方法中的新對象實例化
- 4. 阻止類被實例化
- 5. 注入實例化無法控制的類的最佳方法?
- 6. 防止其他類的類實例化
- 7. 在Scala中實例化類型參數類的最佳方法
- 8. C++:防止抽象基類的任何實例化的方法?
- 9. 檢查實例是否正確實例化的最佳方法
- 10. CodeIgniter中防止SQLInjection的最佳方法
- 11. 防止DocumentEvent循環的最佳方法?
- 12. 訪問類方法到實例方法的最佳方法
- 13. 防止查看次數被濫用的最佳方法
- 14. 防止抽象類實例化
- 15. 防止Winform被最大化?
- 16. 防止價值獲得變化的最佳方法
- 17. 處理無法實例化對象的最佳方法?
- 18. 「否定」實例的最佳方法
- 19. 最佳實踐:調用getInstance方法來實例化對象
- 20. 實例化時自動調用Python類方法的最佳方式
- 21. 本地化實體的最佳方法?
- 22. 基於案例防止SSIS錯誤的最佳實踐
- 23. 實例化EntityManager的最佳實踐
- 24. 在Coq中執行通用實例化的最佳方法
- 25. 實例化XMLHttpRequest對象的最佳方法
- 26. 正確的方法來防止子類實例化,而無需調用所需的初始化方法?
- 27. 防止活動的多重實例化
- 28. python如何防止類被子類化?
- 29. Python:在循環中動態實例化Player類的最佳方法?
- 30. 創建運行時確定類型實例的最佳方法
爲什麼不是摘要 – Trikaldarshi 2012-04-13 12:54:19
「不允許被實例化」是'static class'的確切定義。你爲什麼需要別的東西? – 2012-04-13 12:55:44