3

私は、VB6 コード (VB5 からアップグレードされたもの) から Visual Studio (元は 1.0 または 1.1) によって「アップグレード」された VB.NET WinForms アプリに取り組んでいます。このアプリのメンテナンスを引き継いでから作成したいくつかの新しいフォームを除いて、アプリケーション内のすべてのフォームには DefInstance というメソッドがあり、フォームのメモリ内コピーがあればそれを取得できます。私が理解できないのは、その理由です。私が作業しているスコープ内にすぐにない場合、メモリ内のフォームオブジェクトを参照する必要があるのはいつですか。私の考えでは、これはあらゆる種類の適切なプログラミング原則に違反しており、メモリ リークまたはさらに悪いことへの誘因のように思えます。

質問: (1) この DefInstance は、このアプリの VB6 遺産の単に不幸な名残りですか? (2) アプリケーション全体で DefInstance メソッドを削除する必要がありますか?

4

4 に答える 4

2

Microsoft の従業員から次の回答を受け取りました。

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

つまり、DefInstance は、真の .NET WinForms アプリにされていない古いアプリの「ベスト プラクティスではない」互換性メソッドです。今年の初めまで Web プログラマーだった私は、VB6 "WinForms" アプリケーションを扱ったことがなく、アップグレード ウィザードがアプリケーションを .NET に強制する際に互換性の問題に対処する必要もありませんでした。

于 2008-10-28T14:28:34.597 に答える
2

はい、既定のインスタンスは、アップグレード ウィザードを介してアプリケーションをインポートすることの恐ろしい副産物です。デフォルト インスタンスを使用することは、ドット ネット以前のバージョンでは VB の習慣でした。フォームは常にデフォルト インスタンスとしてメモリに常駐していたためです。ただし、追加のインスタンスを作成することもできます。

Parvenu74 が言ったように、これはベスト プラクティスではありません。そうは言っても、インポートされたアプリケーションからそれを削除するときは、副作用や使用されている可能性のある参照のために、非常に注意する必要があります。最善の策は、開発する新しいコードでは使用せず、時間の経過とともに「変換された」コードからゆっくりと移行することです。上記のように、デフォルトのインスタンスは VB 2005 で再導入されましたが、その使用はお勧めできません。

于 2008-11-10T01:55:19.693 に答える
1

悲しいことに、VB8 (VS2005) には、その有毒な構文糖衣が追加されました。各スレッドが「Form1」の個別のインスタンスを持っていることを理解できない場合、VB.NET プログラマーは致命的に混乱します。良いニュース: DefInstance はもう必要ありません。

于 2008-10-25T04:10:17.770 に答える
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/を参照してください。

于 2008-10-23T22:48:00.557 に答える