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

发布于 2024-10-29 06:33:56 字数 544 浏览 3 评论 0原文

情况 1:

我正在尝试此操作

MessageBox m = new MessageBox();

并遇到编译错误

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

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

class myClass
{

}

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

现在,我的问题:

  • 为什么我在第一种情况下出现错误?

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

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

Case 1:

I am trying this

MessageBox m = new MessageBox();

And got compilation error

'System.Windows.Forms.MessageBox' has no constructors defined

Case 2:
Then, I have made a class without constructor

class myClass
{

}

and tried myClass my = new myClass(); This time I found no error.

Now, my question:

  • Why I am getting error in 1st case?

Since, both are classes and every class have default constructor, then

  • Where is default constructor in 1st case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

如梦初醒的夏天 2024-11-05 06:33:56

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

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

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

The constructor may be private or protected in order to forbid direct instantiation. Use the static factory method instead. There is a static method Show in the MessageBox class.

Archil is right, too. If theres a explicit constructor defined, the implicit default constructor is not created anymore.

And regarding x0ns comments: Yes, it's also impossible to instantiate static classes. Don't use static classes, thats poor design (there are exceptions).

╰◇生如夏花灿烂 2024-11-05 06:33:56

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

In c#, evey class automatically has default constructor if NONE is defined. MessageBox defines other constructors, so it does not automatically have default constructor

疯了 2024-11-05 06:33:56

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

您可以使用以下方法将类设为静态:

static class myclass {}

MessageBox is designed to be used as a static class - see http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

You can make your class static using:

static class myclass {}
深巷少女 2024-11-05 06:33:56

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

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

该类的设计声明您不能将其用作对象。
它仅具有无需实例化该类的对象即可使用的静态方法。

System.Windows.Forms.MessageBox has no default (empty) constructor.

A constructor can be hidden by setting its accessibility to something other than public.

The class' design declares that you can't use it as an object.
It only has static methods that can be used without instantiating an object of that class.

强辩 2024-11-05 06:33:56

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

public static class MessageBox { }

静态类只能有静态方法,因此并不意味着被实例化。

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

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

In case 1, MessageBox is a static class, it has no constructors (update - it has a private constructor says reflector but the OP gave a misleading/incorrect compiler error message.) Static classes are defined like this:

public static class MessageBox { }

A static class can only have static methods, and as such is not meant to be instantiated.

In case 2, MyClass is not a static class, and the compiler generates a default constructor for you if you don't define any constructors.

UPDATE: to all downvoters: go compile up a project with a static class and examine it in reflector - it decompiles without the static keyword becuase there is no MSIL or metadata for a static class; the compiler (in .net 2.0 or later) generates an abstract sealed class with no constructors. The keyword "static" is just syntactic sugar. Additionally, in 1.0/1.1 of .NET (when MessageBox was created,) the static keyword did not exist for classes and the sealed/private ctor was the accepted pattern.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文