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

时间:2011-04-02 15:02:30

标签: c# .net constructor

案例1:

我正在尝试这个

MessageBox m = new MessageBox();

编译错误

  

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

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

class myClass
{

}

并尝试myClass my = new myClass();这次我没有发现任何错误。

现在,我的问题:

  • 为什么我在第一种情况下收到错误?

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

  • 第一种情况下默认构造函数在哪里?

5 个答案:

答案 0 :(得分:15)

构造函数可以是privateprotected,以禁止直接实例化。请改用静态工厂方法。 Show类中有一个静态方法MessageBox

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

关于x0ns评论:是的,实例化静态类也是不可能的。不要使用静态类,这是糟糕的设计(有例外)。

答案 1 :(得分:5)

在c#中,如果定义了NONE,则evey类自动具有默认构造函数。 MessageBox定义了其他构造函数,因此它不会自动拥有默认构造函数

答案 2 :(得分:3)

MessageBox旨在用作静态类 - 请参阅http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

您可以使用以下方法使您的班级保持静态:

static class myclass {}

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:-2)

在第一种情况下,MessageBox是一个静态类,它没有构造函数(更新 - 它有一个私有构造函数说反射器,但OP给出了误导/错误的编译器错误消息。)静态类的定义如下:

public static class MessageBox { }

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

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

更新:对所有downvoters:编译一个带有静态类的项目并在反射器中检查它 - 它在没有static关键字的情况下反编译,因为没有静态类的MSIL或元数据;编译器(在.net 2.0或更高版本中)生成一个没有构造函数的抽象密封类。关键字“静态”只是语法糖。另外,在1.0 / 1.1的.NET中(当创建MessageBox时),类不存在static关键字,而密封/私有ctor是可接受的模式。