投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/1/18 10:46:06
引数の内容を差し替えるような場合は、
ByVal キーワードによる「値渡し」ではなく
ByRef キーワードによる「参照渡し」を用います。
Public Sub out(ByRef a As IntegerByRef b As Integer)


ただし、参照渡しを用いるメソッド設計はあまり行われません。
実際 .NET Framework のライブラリの中でも、ごく限られたケースでしか使われていません。
(「Integer.TryParse メソッド」や「Interlocked.Exchange メソッド」など)

これは、呼び出し側から見た時に、値が書き換えられたことが視覚的に分かりにくい上に、
受け渡しのために必ず変数を用意しなければならないという使いにくさによるものです。

そのため参照渡しを使って引数を直接書き換えるのではなく、
戻り値を用いて結果を返す方が一般的です。
Module Module1
    Sub Main()
        Dim a As Integer = 2
        Dim b As Integer = 5

        'この書き方なら、a, b というデータをもとにして、 
        '左辺の変数が書き換えられるという事が明確になります 
        Dim result = Example1(a, b)
        MsgBox(result.Item1)
        MsgBox(result.Item2)

        Dim results() = Example2(a, b)
        MsgBox(results(0))
        MsgBox(results(1))


        'この書き方だと、呼び出し元のコードを見ただけでは、 
        'a, b のデータが書き換わることが分かりにくいです 
        Out(a, b)
        MsgBox(a)
        MsgBox(b)
    End Sub

    '複数の値を返すためにタプルを使う場合 
    Public Function Example1(a As Integer, b As IntegerAs Tuple(Of IntegerInteger)
        Return Tuple.Create(CInt(a ^ 2), CInt(b ^ 2))
    End Function

    '複数の値を返すために配列を使う場合 
    Public Function Example2(a As Integer, b As IntegerAs Integer()
        Return {CInt(a ^ 2), CInt(b ^ 2)}
    End Function

    '引数の内容を差し替えるために ByRef を使う場合 
    Public Sub Out(ByRef a As IntegerByRef b As Integer)
        a = a ^ 2
        b = b ^ 2
    End Sub
End Module



あるいは《値型》ではなく《参照型》を引数として引き渡し、
その参照型のメンバーを編集する方法もあります。これなら ByVal でも動きます。