为什么C#中的MessageBox类没有默认构造函数?

6
案例 1:

我正在尝试这个。

MessageBox m = new MessageBox();

出现了编译错误

'System.Windows.Forms.MessageBox'没有定义构造函数

情况2:
然后,我创建了一个没有构造函数的类

class myClass
{

}

我尝试了myClass my = new myClass();,这次没有发现错误。

现在,我的问题是:

  • 为什么第一种情况会出错?

因为两个都是类,每个类都有默认构造函数,那么

  • 第一种情况的默认构造函数在哪里?
5个回答

15

为了禁止直接实例化,构造函数可能是private或者protected。相反使用静态工厂方法。在MessageBox类中有一个静态方法Show

Archil也是正确的。如果定义了显式构造函数,则不再创建隐式默认构造函数。

关于x0ns的评论:是的,无法实例化静态类。不要使用静态类,这是一种糟糕的设计(有例外情况)。


1
例如:MessageBox.Show("我的标题", "我的说明") - Anm
1
Show不是一个工厂方法。所有的代码最终都会变成p/invoke。实际上,这个模式是一个静态类模式,但是当messagebox被设计时(pre-whidbey 2.0),static关键字并不存在。 - x0n
“MessageBox.Show”仍然作为一个工厂:它为您创建复杂的东西以减少代码重复。无论您是否获取其句柄或是否有.NET对象创建,这都没有关系。它只是一个特殊情况,因为只有p/invoke。静态类不是一个理想的模式,如果它真的是一个模式的话。这只是由所有本机调用引起的。 - atamanroman

5
在c#中,如果没有定义构造函数,则每个类都会自动具有默认构造函数。MessageBox定义了其他构造函数,因此它不会自动具有默认构造函数。

4
根据 Reflector,它确实有一个构造函数,但该构造函数未标记为“public”。 - Robert Harvey
MessageBox没有公共构造函数。http://msdn.microsoft.com/en-us/library/system.windows.forms.messagebox.aspx - Adam Straughan
这就是我说的。MessageBox 定义了其他构造函数,因此它不会自动拥有默认构造函数。 - archil
2
这不一样。非公共构造函数和非标准构造函数之间有区别,后者仍然可以被调用。 - atamanroman

3

1

System.Windows.Forms.MessageBox没有默认(空)构造函数。

通过将其可访问性设置为除public以外的其他内容,可以隐藏构造函数。

该类的设计声明您不能将其用作对象。
它只有静态方法,可以在不实例化该类的对象的情况下使用。


-1
在第一种情况下,MessageBox是一个静态类,它没有构造函数(更新-反射器表示它有一个私有构造函数,但OP给出了一个误导性/不正确的编译器错误消息)。静态类的定义如下:
public static class MessageBox { }

静态类只能拥有静态方法,因此不适合实例化。

在第二种情况中,MyClass不是静态类,如果您没有定义任何构造函数,编译器会为您生成默认构造函数。

更新:对于所有的反对者:请编译一个包含静态类的项目,并在反编译器中检查它 - 它会被反编译成抽象密封类,没有构造函数,因为静态类没有MSIL或元数据;关键字“static”只是语法糖。此外,在.NET 1.0/1.1(创建MessageBox时)中,类没有静态关键字,密封/私有构造函数是被接受的模式。


4
据Reflector显示,这不是一个静态类。但默认构造函数是私有的(因此无法实例化该类),并且大多数方法都是静态的。 - Robert Harvey
如果你说messagebox类有一个私有的构造函数,我相信你,但我回答是基于编译器错误的。 - x0n
啊,是的,这很有道理。如果你在 Reflector 中查看 System.Math,你会发现它反编译为一个实际的 static 类。Reflector 中的 IL 表明 Math 被标记为 abstract;而 Messagebox 类则不是。Math 仍然包含一个私有的、无参数的构造函数(因为它是 static 的)。 - Robert Harvey
1
@x0n 你有没有考虑到你的语气和用词可能与你的负评有关?尽管我理解你的观点,但是将人们一概而论地称为“无知”,并用“Duh”侮辱他们的智商通常是不可接受的。 - Zaid Masud
1
@ZaidMasud 已删除人身攻击。我可能当时情绪不好。 - x0n
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接