为什么';MessageBox类在C#中是否有默认构造函数?
案例1: 我正在尝试这个为什么';MessageBox类在C#中是否有默认构造函数?,c#,.net,constructor,C#,.net,Constructor,案例1: 我正在尝试这个 MessageBox m = new MessageBox(); 并得到编译错误 “System.Windows.Forms.MessageBox”未定义构造函数 案例2: 然后,我创建了一个没有构造函数的类 class myClass { } 并尝试了myClass my=new myClass()这次我没有发现错误。 现在,我的问题是: 为什么我在第一种情况下出错? 因为,这两个类都是类,每个类都有默认构造函数,那么 第一种情况下默认构造函数在哪里? 构
MessageBox m = new MessageBox();
并得到编译错误
“System.Windows.Forms.MessageBox”未定义构造函数
案例2:然后,我创建了一个没有构造函数的类
class myClass
{
}
并尝试了myClass my=new myClass()代码>这次我没有发现错误。
现在,我的问题是:
- 为什么我在第一种情况下出错?
因为,这两个类都是类,每个类都有默认构造函数,那么
- 第一种情况下默认构造函数在哪里?
构造函数可以是私有的
或受保护的
,以禁止直接实例化。改用静态工厂方法。在MessageBox
类中有一个静态方法Show
阿切尔也是对的。如果定义了显式构造函数,则不再创建隐式默认构造函数
关于x0ns注释:是的,实例化静态类也是不可能的。不要使用静态类,这是糟糕的设计(也有例外)。在c#中,如果没有定义任何构造函数,每个类都会自动具有默认构造函数。MessageBox定义了其他构造函数,因此它不会自动具有默认构造函数MessageBox被设计为用作静态类-请参阅
class myClass
{
}
您可以使用以下命令使类成为静态的:
static class myclass {}
在案例1中,MessageBox是一个静态类,它没有构造函数(更新-它有一个私有构造函数,但OP给出了一个误导性/不正确的编译器错误消息。)静态类的定义如下:
public static class MessageBox { }
静态类只能有静态方法,因此不能实例化
在案例2中,MyClass不是一个静态类,如果您没有定义任何构造函数,编译器将为您生成一个默认构造函数
更新:给所有的投票人:去编译一个带有静态类的项目,并在reflector中检查它-它不使用static关键字进行反编译,因为静态类没有MSIL或元数据;编译器(在.NET2.0或更高版本中)生成一个没有构造函数的抽象密封类。关键字“static”只是语法上的糖分。此外,在.NET的1.0/1.1版本中(创建MessageBox时),类不存在static关键字,密封/私有的构造函数是可接受的模式。没有默认(空)构造函数
可以通过将构造函数的可访问性设置为公共以外的内容来隐藏构造函数
类的设计声明不能将其用作对象。
它只有静态方法,可以在不实例化该类对象的情况下使用。根据Reflector,它确实有一个构造函数。但是构造函数没有标记为public
MessageBox定义了其他构造函数,因此它不会自动拥有不同的默认构造函数。。非公共构造函数和非标准构造函数之间有区别,它们仍然是可调用的。Reflector认为,它不是一个静态类。但是默认构造函数是私有的(因此不能实例化该类),并且大多数方法都是静态的。@robert-编译器错误消息“no constructors”不是您尝试用私有构造函数实例化类时得到的。这是你试图实例化一个没有构造函数的静态类所得到的。如果你说MaseBox类有一个私有的CCTR,我相信你,但是我是根据编译器错误来回答的。@ X0N曾经考虑过下注可能与你的语调和单词选择有关吗?尽管我理解你的推理,但把人们笼统地称为“无知”并用“Duh”来侮辱他们的智慧是很难的。我当时可能心情不好。例如:MessageBox.Show(“我的标题”、“我的标题”)Show不是工厂方法。所有代码最终都是p/invoke。该模式实际上是一个静态类模式,但在设计messagebox(pre-whidbey 2.0)messagebox时,static关键字并不存在。Show
仍然充当一个工厂:它为您创建了一些复杂的东西,以减少代码重复。不管您是否获得了它的句柄,或者是否创建了.NET对象。这只是一个特例,因为只有p/invoke。静态类不是理想的模式,如果它是一种模式的话。这是所有本地电话引起的。