問題の歴史:
Visual Basicのネストされた手続き(ローカル関数)は、VB.NETのバージョン15.0(Visual Studio 2017)から登場したため、従来のVB6とは異なります。この特徴により、他の手続き内で手続きを宣言することが可能となり、言語の表現力が拡大し、サポートロジックの組織化が簡素化されます。
問題
特定のメソッド内のみで必要なサポートロジックが頻繁に発生し、他の場所では必要ない場合が多いです。以前は、プライベートメソッドを作成する必要があり、名前空間が煩雑になり、コードのナビゲーションが困難でした。しかし、ローカル関数でもスコープに関する問題、変数へのアクセスエラー、デバッグの難しさに直面することがあります。
解決策
ネストされた手続きは、親手続き内でサービスロジックをカプセル化し、コードをより読みやすくし、サポートメソッドのスコープを制限します。VB.NETでは、ネストされた関数の宣言は次のようになります:
Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"合計 — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub
主な特徴:
ネストされた手続きは、Public、Friend、またはProtectedの修飾子を持つことができますか?
いいえ、ネストされた手続きには、親手続き内での可視性レベルのみが許可されます。Public/Friend/Protectedとして宣言することはできず、ローカルにのみアクセス可能です。
ForまたはIf構文内にネストされた手続きを宣言できますか?
いいえ、ローカル関数はメソッド(手続き)の最上位のみで宣言することができますが、ネストされたブロック(たとえば、For、If、While)の内部には宣言できません。
ネストされた手続きは非同期(Async Sub/Function)にすることができますか?
はい、非同期ローカル関数を宣言することができ、メソッド内で非同期実行ロジックをカプセル化できます:
Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("非同期操作が完了しました。") End Function End Sub
プロジェクト内でローカル関数の代わりにプライベートメソッドが過剰に使用され、数十のサービス手続きがクラスのインターフェースを「混乱させ」ました。ナビゲーションが非常に困難になりました。
長所:
短所:
内部ロジックにはローカル関数アプローチを使用し、すべてのサービス処理が主要なメソッド内に配置され、自己文書化されたコードでメンテナンスが容易でした。
長所:
短所: