2014年4月2日

VB.NET に ByOut は無いが OutAttribute はある

VB.NET に C#.NET の out に相当するものは、残念ながら存在しない。

VB.NET だけなら ByRef を使用していればいいのだが(使用するしかない)、VB.NET で作成した ByRef 引数を持つメソッドを C#.NET から呼ぶ場合、ref / out が区別できないと不便である。(ByRef のみでは ref に相当する)
これを解決する方法として、OutAttribute がある。


' C# から呼ぶ場合、引数"ret"は ref として扱える。
Public Shared Function AddRef(ByVal x As String, ByVal y As String,
                              ByRef ret As Integer) As Boolean
    Dim xi, yi As Integer
    If Integer.TryParse(x, xi) AndAlso Integer.TryParse(y, yi) Then
        ret = xi + yi
        Return True
    End If
    Return False
End Function

' C# から呼ぶ場合、引数"ret"は out として扱える。
Public Shared Function AddOut(ByVal x As String, ByVal y As String,
                              <Out()> ByRef ret As Integer) As Boolean
    Dim xi, yi As Integer
    If Integer.TryParse(x, xi) AndAlso Integer.TryParse(y, yi) Then
        ret = xi + yi
        Return True
    End If
    Return False
End Function

ただし、この属性は、C#.NET から呼ぶ場合に out として扱えるだけで、VB.NET に out 機能を提供するわけではないことに注意。
あくまで VB.NET は、ref = ByRef のみ。

0 件のコメント:

コメントを投稿