Что такое «DefInstance» и нужно ли удалять его из приложения WinForms? - PullRequest
2 голосов
/ 24 октября 2008

Я работаю над приложением VB.NET WinForms, которое было «обновлено» Visual Studio (изначально 1.0 или 1.1) из кода VB6 (который сам был обновлен с VB5). За исключением нескольких новых форм, которые я создал с тех пор, как принял на себя обслуживание этого приложения, все формы в приложении имеют метод DefInstance, который позволяет вам получить копию формы в памяти, если она есть. Что я не могу понять, так это почему: когда мне когда-нибудь нужно будет ссылаться на объект формы в памяти, когда он находится не в той области, где я работаю. На мой взгляд, это нарушает все виды принципов звукового программирования и выглядит как приглашение к утечкам памяти или еще хуже.

Вопросы: (1) эта вещь DefInstance - просто неудачный остаток наследия VB6 этого приложения, и (2) я должен указать на удаление методов DefInstance во всем приложении?

Ответы [ 4 ]

2 голосов
/ 10 ноября 2008

В ответ на ваш вопрос: Да, экземпляр по умолчанию является ужасным побочным продуктом импорта приложения с помощью мастера обновления. Использование экземпляра по умолчанию было привычкой VB в версиях с точечной сетью, потому что формы всегда оставались в памяти как экземпляр по умолчанию, хотя вы также можете создать дополнительные экземпляры. Как сказал Parvenu74, это не лучшая практика. При этом вы должны быть очень осторожны при удалении его из импортированного приложения из-за побочных эффектов и ссылок, где оно может быть использовано. Лучше всего не использовать его в новом коде, который вы разрабатываете, и постепенно переносить себя из «преобразованного» кода с течением времени. Как было упомянуто выше, материал экземпляра по умолчанию был повторно введен в VB 2005, но его использование крайне не рекомендуется.

2 голосов
/ 28 октября 2008

Я получил ответ от сотрудника Microsoft:

http://msdn.microsoft.com/en-us/library/aa289529(VS.71,printer).aspx

Короче говоря, DefInstance - это метод совместимости «не передовой практики» для старых приложений, которые не были превращены в настоящие приложения .NET WinForms. Будучи веб-программистом до начала этого года, я никогда не работал с приложениями VB6 «WinForms» и не сталкивался с компромиссами в совместимости, которые делает мастер обновления, чтобы заставить их работать в .NET.

1 голос
/ 25 октября 2008

К сожалению, этот токсичный кусочек синтаксического сахара был добавлен к VB8 (VS2005). Теперь это ужасно сбивает с толку программистов на VB.NET, когда они не могут понять, что у каждого потока есть отдельный экземпляр «Form1». Хорошая новость: теперь вам определенно не нужен DefInstance.

1 голос
/ 24 октября 2008

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

Я видел много VB, написанных так:

Private Sub Command_Click()
   Call DoStuff
End Sub

Private Sub DoStuff()
   Form1.myTextbox.Text = "Bad Idea"
End Sub

DefInstance позволяет DoStuff () продолжать работу без передачи элементов управления.

См. Здесь: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/6d7985b5-6db6-47a8-9e11-cbf114a48d37/ для получения дополнительной информации.

...