関数を変数呼び?する方法

解決


モモ  2008-12-08 19:21:34  No: 145468

VB.NET2005です。
関数func_A、func_B、func_C、func_D、func_E…があります。
これらを処理モード(intSyoriMode)の内容により、
呼んだり呼ばなかったりします。
登録した関数配列?的なもので、その配列の数分ループさせたいのですが、
そんなことは出来ますか?
-------------------------------------------------------------
(例)
■intSyoriMode=1のときは、
関数配列にfunc_A、func_C、func_Dを登録し、この3つの関数を実行します。
■intSyoriMode=2のときは、
関数配列にfunc_B、func_D、func_Eを登録し、この3つの関数を実行します。
-------------------------------------------------------------
このような分岐が大量にありますので、関数配列的なことが出来るので
あれば、そうしたいのです。
もちろん地道に条件を記述すれば目的は果たせますが。
関数配列といいますか、そもそも関数を変数で呼び出すことはできるのでしょうか。
教えて下さい。
何卒よろしくお願い申し上げます。


aetos  2008-12-08 20:06:29  No: 145469

呼びたい各関数の引数と戻り値の型が同じであるならできるでしょう。
呼びたい関数と同じ引数型、同じ戻り値型のデリゲート型を宣言して、その配列を作ればよいです。
例えば、各関数が Integer を引数に取り Integer を返すものならば、

' 名前はもっと適切なものにしてくださいな
Delegate Sub FunctionDelegate( ByVal arg As Integer ) As Integer

Dim delegates(3) As FunctionDelegate
delegates(0) = func_A
delegates(1) = func_A
delegates(2) = func_A

For i As Integer = 0 To 2
 delegates(i)(10)
Next i

みたいな感じで。

# VB.NET の配列宣言の書き方ってしっくりこないなぁ…
# 構文が間違えていたらごめんなさいね。


モモ  2008-12-09 18:15:11  No: 145470

早速のレスありがとうございました。

Delegate Function FunctionDelegate( ByVal arg As Integer ) As Integer

Dim delegates(3) As FunctionDelegate
delegates(0) = AddressOf func_A
delegates(1) = AddressOf func_B
delegates(2) = AddressOf func_C

For i As Integer = 0 To 2
 delegates(i)(10)
Next i

といった感じで実現出来ました。

ありがとうございました。


aetos  2008-12-09 18:54:56  No: 145471

あ、そっか。AddressOf が要るんだ。
いや、普段 VB やってないもので。もうしわけない。


魔界の仮面弁士  2008-12-09 19:11:26  No: 145472

ついでに書くと:

> Dim delegates(3) As FunctionDelegate
VB の場合、(3) は配列の個数ではなく、インデックスの最大値を
意味するので、0〜2 を使う場合は Dim delegates(2) As FunctionDelegate です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加