C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103074 / 3階層)  構造体のループ処理
□投稿者/ 魔界の仮面弁士 (3765回)-(2024/04/18(Thu) 11:59:26)
2024/04/18(Thu) 12:03:22 編集(投稿者)

No103072 (dai さん) に返信
> 今回既存PGへの処理の追加を行っており、objTest1〜3(実際はobjTest40まである)はすでにいろいろな処理に使われていて、
> そちらには手を入れたくない、という背景があります。

構造体である以上、設定後に書き戻す処理が発生してしまうことになると思います。

Dim o() = {Nothing, objTest1, objTest2, objTest3}

'ループ処理
For i = 1 To 3
  o(i).data1 = CDec(i)
Next

objTest1 = o(1)
objTest2 = o(2)
objTest3 = o(3)



相手が Class なら、
 Choose(i, objTest1, objTest2, objTest3).data1 = CDec(i)
などといった手も使えるのですけれどね。

相手が Structure となると、CallByName やリフレクションでもどうにもならないと思います。
https://smdn.jp/programming/netfx/tips/set_struct_field_using_reflection/

VB の Choose 関数が、VB2017 で実装された「ByRef 戻り値」を採用しているなら
 Choose(i, objTest1, objTest2, objTest3).data1 = CDec(i)
みたいに書けるかとも思ったものの、参照渡しな可変個引数がサポートされていない以上、どっちにしても NG 。



あと思いつくのは、デリゲートで操作できるようなヘルパーを用意するとか…?

Friend Delegate Sub TestProc(ByRef t As ST_TEST)
Friend Sub Helper(index As Integer, proc As TestProc)
 Select Case index
  Case 1 : proc(objTest1)
  Case 2 : proc(objTest2)
  Case 3 : proc(objTest3)
 End Select
End Sub

Sub Main()
 For i = 1 To 3
  Dim value = CDec(i)
  Helper(i, Sub(ByRef o) o.data1 = value)
 Next
 Stop
End Sub
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: 構造体のループ処理 /dai 返信無し
 
上記関連ツリー

構造体のループ処理 / dai (24/04/18(Thu) 10:40) #103070
Re[1]: 構造体のループ処理 / 魔界の仮面弁士 (24/04/18(Thu) 11:01) #103071
  └ Re[2]: 構造体のループ処理 / dai (24/04/18(Thu) 11:29) #103072
    ├ 構造体のループ処理 / 魔界の仮面弁士 (24/04/18(Thu) 11:59) #103074 ←Now
    └ Re[3]: 構造体のループ処理 / dai (24/04/18(Thu) 11:54) #103073 解決済み
      └ Re[4]: 構造体のループ処理 / 魔界の仮面弁士 (24/04/18(Thu) 12:05) #103075
        └ Re[5]: 構造体のループ処理 / dai (24/04/18(Thu) 13:19) #103076 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信