Формы в VB.Net - PullRequest
       30

Формы в VB.Net

2 голосов
/ 03 декабря 2008

Я из c # фона и конвертирую приложение Windows vb.net формы в c #. У меня есть форма окна под названием associateForm. В коде ссылки на ссылки для разработчиков выглядят так: -

Private Sub NotifyIcon1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles EMS.MouseDoubleClick
    If e.Button = Windows.Forms.MouseButtons.Left Then

        If associateForm.WindowState = FormWindowState.Normal And associateForm.Visible = True Then
            associateForm.WindowState = FormWindowState.Minimized
        Else
            associateForm.WindowState = FormWindowState.Normal
        End If

        associateForm.Show()
        associateForm.Focus()
        'bring to front of other windows
        associateForm.Activate()
    End If
End Sub

Но дело в том, что метод associateForm не создается в классе, где выполняется метод. Класс не является статичным. Кажется, что нигде в коде нет экземпляра класса. Может ли кто-нибудь пролить свет на то, почему это работает, но когда я пытаюсь это сделать в C #, у него ничего не получается.

Ответы [ 4 ]

6 голосов
/ 03 декабря 2008

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

2 голосов
/ 03 декабря 2008

Несколько вещей не так с предыдущими комментариями. Джоэл в основном правильный ответ, с одной маленькой оговоркой:

Когда вы определяете форму, вы получаете автоматический экземпляр формы с тем же именем, что и у типа.

Вы на самом деле получаете экземпляр только тогда, когда вызываете его. До этого экземпляр по умолчанию не создается. Таким образом, создание экземпляра откладывается до момента использования.

Использование имени формы в качестве экземпляра на самом деле является ярлыком для My.Forms.Formname, который представляет собой сгенерированный компилятором список свойств для всех форм. Эти свойства отвечают за создание объекта. К сожалению, Microsoft решила сделать эти свойства неявно доступными в глобальном масштабе (отсюда и вопрос ОП).

Эта функция существует, потому что VB.NET эмулирует метод VB6, позволяющий ссылаться на экземпляр формы по умолчанию через его имя.

Хорошо. Хотя эта функция основана на предыдущих версиях VB, она не является прямой. VB 7 не было этого. Скорее это было повторно введено с VB 8 (= VB 2005).

Действительно очень глупая "фича"

На самом деле это очень полезная функция, которая очень хорошо сочетается с философией разработки RAD в VB. Как упомянуто выше, к сожалению, такой свободный обзор используется. Но кроме этого, мне было бы очень интересно услышать, что такого "глупого" в этой функции.

0 голосов
/ 04 декабря 2008

Я не могу ответить на ваш вопрос напрямую, но ...

Я предполагаю, что вы конвертируете VB.Net в C # вручную - вы пробовали использовать автоматический конвертер вместо этого?

0 голосов
/ 03 декабря 2008

Джоэл прав. Эта функция существует, потому что VB.NET эмулирует метод VB6, позволяющий ссылаться на экземпляр формы по умолчанию через его имя.

Когда вы конвертируете это в C #, вам необходимо предоставить глобальный доступ к одному экземпляру с именем associateForm. Существует вероятность того, что между вызовами этой формы что-то сохраняется. После того, как вы успешно это сделали. Затем вы можете выполнить рефакторинг программного обеспечения и проверить, будет ли локальный экземпляр работать так же.

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