簡體   English   中英

為什么MessageBox類在C#中沒有默認構造函數?

[英]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(); 這次我沒有發現任何錯誤。

現在,我的問題:

  • 為什么我在第一種情況下收到錯誤?

因為,兩個都是類,每個類都有默認構造函數

  • 第一種情況下默認構造函數在哪里?

構造函數可以是privateprotected ,以禁止直接實例化。 請改用靜態工廠方法。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM