案例1:
我正在尝试这个
MessageBox m = new MessageBox();
编译错误
'System.Windows.Forms.MessageBox'没有定义构造函数
案例2:
然后,我创建了一个没有构造函数的类
class myClass
{
}
并尝试myClass my = new myClass();
这次我没有发现任何错误。
现在,我的问题:
因为,两个都是类,每个类都有默认构造函数,所以
答案 0 :(得分:15)
构造函数可以是private
或protected
,以禁止直接实例化。请改用静态工厂方法。 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是可接受的模式。