![](/img/trans.png)
[英]Why does my C# TestClass class complain (wrongly) that its parent doesn't have a parameterless constructor?
[英]Why doesn't the MessageBox class have a default constructor in C#?
情況1:
我正在嘗試這個
MessageBox m = new MessageBox();
並得到編譯錯誤
'System.Windows.Forms.MessageBox'沒有定義構造函數
案例2:
然后,我創建了一個沒有構造函數的類
class myClass
{
}
並嘗試了myClass my = new myClass();
這次我沒有發現任何錯誤。
現在,我的問題:
因為,兩個都是類,每個類都有默認構造函數
構造函數可以是private
或protected
,以禁止直接實例化。 請改用靜態工廠方法。 MessageBox
類中有一個靜態方法Show
。
Archil也是對的。 如果定義了顯式構造函數,則不再創建隱式默認構造函數。
關於x0ns注釋:是的,實例化靜態類也是不可能的。 不要使用靜態類,這是糟糕的設計(有例外)。
在c#中,如果定義了NONE,則evey類自動具有默認構造函數。 MessageBox定義了其他構造函數,因此它不會自動擁有默認構造函數
MessageBox旨在用作靜態類 - 請參閱http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
您可以使用以下方法使您的類靜態:
static class myclass {}
System.Windows.Forms.MessageBox沒有默認(空)構造函數。
可以通過將其可訪問性設置為除public之外的其他內容來隱藏構造函數。
類的設計聲明你不能將它用作對象。
它只有靜態方法,可以在不實例化該類對象的情況下使用。
在案例1中,MessageBox是一個靜態類,它沒有構造函數(更新 - 它有一個私有構造函數說反射器,但OP給出了一個誤導/錯誤的編譯器錯誤消息。)靜態類定義如下:
public static class MessageBox { }
靜態類只能有靜態方法,因此不能實例化。
在案例2中,MyClass不是靜態類,如果您沒有定義任何構造函數,編譯器會為您生成默認構造函數。
更新:對所有downvoters:使用靜態類編譯項目並在反射器中檢查它 - 它在沒有static關鍵字的情況下反編譯,因為沒有靜態類的MSIL或元數據; 編譯器(在.net 2.0或更高版本中)生成一個沒有構造函數的抽象密封類。 關鍵字“靜態”只是語法糖。 此外,在1.0 / 1.1的.NET(創建MessageBox時)中,類不存在static關鍵字,而密封/私有ctor是可接受的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.