Почему класс MessageBox не имеет конструктора по умолчанию в C #? - PullRequest
6 голосов
/ 02 апреля 2011

Случай 1:

Я пытаюсь это

MessageBox m = new MessageBox();

И получил ошибку компиляции

'System.Windows.Forms.MessageBox' не имеет конструкторов, определенных

Дело 2:
Затем я сделал класс без конструктора

class myClass
{

}

и попробовал myClass my = new myClass(); На этот раз Я не нашел ошибки.

Теперь мой вопрос:

  • Почему я получаю ошибку в 1-м случае?

Так как оба являются классами и каждый класс имеет конструктор по умолчанию, то

  • Где находится конструктор по умолчанию в первом случае?

Ответы [ 5 ]

15 голосов
/ 02 апреля 2011

Конструктор может быть private или protected, чтобы запретить прямую реализацию. Вместо этого используйте статический метод фабрики. В классе MessageBox есть статический метод Show.

Арчил тоже прав. Если определен явный конструктор, то неявный конструктор по умолчанию больше не создается.

А что касается комментариев x0ns: Да, также невозможно создавать экземпляры статических классов. Не используйте статические классы, это плохой дизайн (есть исключения).

5 голосов
/ 02 апреля 2011

В c # класс evey автоматически имеет конструктор по умолчанию, если определено NONE. MessageBox определяет другие конструкторы, поэтому автоматически не имеет конструктора по умолчанию

3 голосов
/ 02 апреля 2011

MessageBox предназначен для использования в качестве статического класса - см. http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

. Вы можете сделать свой класс статичным, используя:

1 голос
/ 02 апреля 2011

System.Windows.Forms.MessageBox не имеет конструктора по умолчанию (пусто).

Конструктор можно скрыть, установив его доступность для чего-то, кроме public,

Дизайн класса объявляет, что вы не можете использовать его как объект.
У него есть только статические методы, которые можно использовать без создания экземпляра объекта этого класса.

0 голосов
/ 02 апреля 2011

В случае 1 MessageBox является статическим классом, у него нет конструкторов (обновление - у него есть частный конструктор, который говорит о рефлекторе, но ОП выдает ошибочное / неверное сообщение об ошибке компилятора.) Статические классы определяются так:

public static class MessageBox { }

Статический класс может иметь только статические методы, и как таковой не предназначен для создания экземпляров.

В случае 2 MyClass не является статическим классом, и компилятор генерирует конструктор по умолчанию для вас, если вы не определяете никаких конструкторов.

ОБНОВЛЕНИЕ: всем нижестоящим: скомпилируйте проект со статическим классом и изучите его в отражателе - он декомпилируется без ключевого слова static, потому что для статического класса нет MSIL или метаданных; компилятор (в .net 2.0 или новее) генерирует абстрактный запечатанный класс без конструкторов. Ключевое слово «статический» - просто синтаксический сахар. Кроме того, в 1.0 / 1.1 .NET (когда был создан MessageBox) статическое ключевое слово не существовало для классов, и закрытый / закрытый ctor был принятым шаблоном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...