web-dev-qa-db-ja.com

関数をvb.netのパラメーターとして渡しますか?

私は、Excelファイルに対して同様のさまざまな読み取り/書き込み操作を実行するクラスを持っています。これらの操作はすべて、個別の関数で定義されています。それらはすべて、同じ長いコードブロック内に含まれている必要があります(ファイルをチェックして開く、保存、閉じるなどのコード)。毎回このコードを複製する必要がない合理的な方法は何ですか?問題は、メソッドごとに異なるコードを実行する前に、1つのメソッドですべての共有コードを含めることはできないということです。そのコードは、共有コードのif、try、forステートメントの多くのレイヤーに含める必要があるためです。

関数をパラメーターとして渡し、共有コード内でその関数を実行することは可能ですか?またはこれを処理するより良い方法はありますか?

16

delegate を使用して、特定の署名を持つ関数/サブルーチンを渡すこともできます。

3
Steve

実際の質問に焦点を当てます:

関数をパラメーターとして渡すことは可能ですか?

はい。 _AddressOf TheMethod_を使用して、メソッドを別のメソッドに渡します。引数の型は、署名がターゲットメソッドの署名と一致するデリゲートである必要があります。メソッド内では、パラメーターを実際のメソッドのように扱います。例:

_Sub Foo()
    Console.WriteLine("Foo!")
End Sub

Sub Bar()
    Console.WriteLine("Bar!")
End Sub

Sub CallSomething(f As Action)
    f()
End Sub

' … somewhere:
CallSomething(AddressOf Foo)
CallSomething(AddressOf Bar)
_

先ほど述べたように、実際のパラメータータイプは、渡すメソッドのシグネチャによって異なります。 Action(Of T) または Func(Of T) またはカスタムデリゲートタイプを使用します。

ただし、多くの場合、デリゲートの代わりにインターフェースを使用し、異なるクラスにインターフェースを実装させ、それらの異なるクラスのオブジェクトをメソッドに渡すことが実際に適切です。

29
Konrad Rudolph

パラメータをFunc(Of T)またはAction(Of T)として宣言します。

どちらを使用するかは、メソッドのシグネチャによって異なります。あなたが私たちにそれを与えたなら、私はあなたにもっと正確な答えを与えることができます。

6
MarcinJuraszek