在C#中,是否有辦法強制類必須有無參數構造函數?無參數構造函數
無參數構造函數
回答
如果你在談論泛型約束,是:
class SomeContainer<T> where T : new() {
...
}
如果你在談論繼承。不可能要求每個實現接口或繼承基類的類都有一個無參數的構造函數。
你能做的最好是在你的基地構造函數拋出一個異常(在運行時)使用反射,這樣的:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
如果你談論的是一個類,是的;只要放一個。
這取決於你的意思。例如,您可以約束類或方法中的泛型類型參數,使其具有無關參數的構造函數,其關鍵字爲new
,但是除此之外,沒有真正的限制實際類定義的方法。
public void DoSomething<T>() where T : new() { }
作爲官方MSDN文檔中所提到的,C#編譯器自動地生成參數的構造函數,它初始化所有成員變量的缺省值。如果你想執行自己的實現,你可以簡單地這樣做:
類BaseClass的 { 的BaseClass(){//參數的構造函數的執行}}
如果你指的是通用的限制,然後參考SLaks的帖子。
參考
此外,您可以強制類不利用私有訪問修飾符有一個參數的構造函數。 – 2010-07-13 02:35:40
只要至少有一個基礎構造函數是public或protected(或者如果子類在同一個程序集中),子類仍然可以有無參數的構造函數,即使基類構造函數是私有的。 – 2010-07-13 02:38:16
@Postman:它會限制子始終提供一定的參數給基類的構造,但是這是從「行不通」相去甚遠。 – 2010-07-13 02:39:24
我遇到這樣的問題很多次,我認爲有抽象/接口構造的要求。麻煩的是當你使用Activator.CreateInstance
或其他技術來實例化一個你可能不會實現的類型(很常見的IoC)。如果您可以強制開發人員使用正確的參數來實現構造函數,生活將會變得更加簡單 - 即使目的僅僅是將參數傳遞給基礎構造函數。
new()
約束從2.0開始就幫助解決了這個問題,但是在使用不使用泛型時仍然不能解決問題,或者如果您確實需要特定參數(並且不想混淆尷尬ConstructorInfo,它不能被靜態檢查。)
泛型可以強制執行這一點,但我們並不總是使用泛型,P
如果您正在使用單元測試,你可以使用反射來找到所有符合模式的類型,您要有參數構造函數(例如,一切從MyBaseObject
衍生,或一切都在Foo.Bar
命名空間),並驗證方式(由找到參數構造)。
如果你想在運行時斷言這也(也許在#DEBUG
),像靜態構造函數是有用的點注入額外類型的檢查。
- 1. 無參數構造函數調用2參數構造函數
- 2. 無參數構造函數
- 3. 構造函數和無參數構造函數?
- 4. 從C#中的參數化構造函數調用無參數構造函數?
- 5. 無參數的構造函數V/S構造函數使用參數
- 6. 沒有參數的構造函數或參數構造函數
- 7. 用無參數構造函數記錄?
- 8. 泛型無參數構造函數
- 9. System.Data.Entity.Spatial.DbGeography - 沒有無參數構造函數
- 10. NBuilder無參數構造函數錯誤
- 11. WPF DataGrid和無參數構造函數
- 12. swiftsuspenders構造函數參數?
- 13. 構造函數的參數
- 14. 參數類構造函數
- 15. 從構造函數參數
- 16. LinearGradientBrush構造函數參數
- 17. ConcurrentHashMap構造函數參數?
- 18. StructureMap構造函數參數
- 19. 從參數化構造函數調用默認構造函數
- 20. 構造函數調用具有參數的構造函數
- 21. 我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
- 22. 與參數的構造函數模型被解釋爲無參數的構造函數
- 23. 斯卡拉額外無參數構造函數加上默認的構造函數參數
- 24. C++數組構造函數的參數
- 25. 無參數的構造
- 26. 結構不能包含顯式的無參數構造函數
- 27. C++「無效構造函數」
- 28. com.esotericsoftware.kryo.KryoException:無法創建類(缺少無參數構造函數):scala.Tuple2
- 29. ADO.NET無法生成無參數構造函數
- 30. 如何使用無參構造函數調用帶有2個參數的構造函數?
請提供更多的細節。 – SLaks 2010-07-13 02:35:19