Почему я могу вызвать Form.Close (), если это не статический метод - PullRequest
5 голосов
/ 19 января 2012

Может кто-нибудь объяснить это мне?

В Visual Studio 2010 создайте приложение Windows Forms для VB.net. Добавьте 2 формы: Form1 и Form2. В событии Form1 Load введите Form2.Close (). Теперь, если мы посмотрим на определение метода, Close () не является статическим (разделяемым) методом. Так как же это возможно скомпилировать или работать во время выполнения.

Кроме того, сделайте то же самое в C # и Form2.Close (); не компилируется.

Что происходит? Почему это возможно в VB.net и что на самом деле происходит при выполнении этой строки кода?

Ответы [ 3 ]

6 голосов
/ 19 января 2012

Вы обнаружили VB.NET-изм, который называется «экземпляр по умолчанию».

Компилятор фактически выдает это:

My.Forms.Form2.Close();

Здесь есть хорошая запись этой функции :

Экземпляр по умолчанию - это объект такого типа, который среда разработки приложений VB создает и управляет вами.

...

Если вы используете экземпляр по умолчанию, вам не нужно явно вызывать конструктор. Вы просто получаете доступ к экземпляру по умолчанию напрямую через объект My.Forms

5 голосов
/ 19 января 2012

Причина в том, что VB создает автоматический экземпляр формы, если вы просто ссылаетесь на них по имени, что может привести к непредвиденным последствиям во время выполнения, если он не будет перехвачен.

Нет настройки, которую янашли, чтобы предотвратить это.

Однако вы можете «сломать» это поведение во время компиляции, изменив область видимости конструктора по умолчанию с Public на Friend или удалив конструктор по умолчанию и добавив конструктор, для которого требуется параметр.Либо, либо эти изменения отключат автоматическую ссылку на форму.

1 голос
/ 19 января 2012

Вы правы, вы не можете вызвать Form2.Close();, когда Form2 является только типом класса.VB.NET, однако, создает за кадром свойство с тем же именем, поэтому вы действительно вызываете Close в экземпляре Form2.Вы можете сделать то же самое в C #, если вы вручную создадите такое свойство.Это похоже на статический вызов метода, но это не так.

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