2008-10-23 4 views
2

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

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

ответ

2

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

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

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

1

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

Я видел много 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/ для получения дополнительной информации.

1

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

2

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