3

メソッド呼び出しでByrefをByvalに切り替える

次の理由で多くの警告が発生しました。

「'ByRef'パラメータzzzzの値を一致する引数にコピーして戻す際のxxxxからyyyyへの暗黙の変換。」

これらのメソッド内の参照型ポインターでは特別なことは何も行われておらず、参照型は単に使用されているだけなので、関数パラメーターをbyrefからbyvalに変更しても安全だと思います。実行しても、動作はまったく同じだと思います。オリジナルではなくポインタをコピーしてください。

もう1つの考慮事項は、基本クラスから継承する2つのクラスがあることです。byrefパラメータが基本クラスからより狭い具象クラスへの暗黙のキャストを引き起こしているという点で同じ状況が発生しています。繰り返しますが、byvalを実行しているこのコードにも問題はありません。

参照型を扱うときに関数でパラメーターを使用するためのヒントはありますか?

私のプロジェクトで現在byrefに渡されている他のいくつかは、データベース接続オブジェクト、つまりOracleConnectionとSqlConnectionです。これらをbyrefに渡す正当な理由はありますか?

例1

'ByRef'パラメータ'value'の値を一致する引数にコピーして戻す際の'Object'から'Integer'への暗黙の変換。

発信コード:

cmd = New SqlCommand()

cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue))

働き:

Private Function CreateParameter(ByVal parameterName As String, ByVal dbType As SqlDbType, ByVal direction As ParameterDirection, ByVal size As Integer, ByRef value As Object) As SqlParameter
    Dim retParam As SqlParameter
    retParam = New SqlParameter(parameterName, dbType)
    retParam.Direction = direction
    retParam.Size = size
    retParam.Value = value
    Return retParam
End Function

例2

「ByRef」パラメータ「reader」の値を一致する引数にコピーして戻す際の「System.Data.IDataReader」から「System.Data.SqlClient.SqlDataReader」への暗黙の変換。

発信コード:

Dim reader As new SqlDataReader

ReleaseReader(reader)

方法:

    Public Sub ReleaseReader(ByRef reader As IDataReader)
        If reader IsNot Nothing Then
            If Not reader.IsClosed Then
                reader.Close()
            End If
            reader.Dispose()
        End If
    End Sub
4

1 に答える 1

5

VB.NetまたはC#でメソッドを定義する場合、ByRefセマンティクスを利用する必要がない限り、パラメーターを値(ByVal)で渡す必要があります。メソッド内のパラメーター値をリセットしない場合は、これらを確実にByVal呼び出しに変換する必要があります。

参照をリセットしているが、呼び出しサイトからそれを利用していない場合は、パラメーターByValを受け取り、ByRefを受け取るヘルパーメソッドを呼び出すヘルパーメソッドを記述します。結果のコードはナローイング変換エラーの影響を受けないため、これにより警告が削除されます。

例えば:

Public Sub ExampleMethod(ByRef p1 As Object) 
  p1 = "foo"
End Sub

Public Sub ExampleMethodWrapper(ByVal p1 as Object)
  ExampleMethod(p1)
End Sub 

Public Sub Test()
  Dim v1 As String = "hello"
  Dim v2 As String = "world" 
  ExampleMethod(v1) ' Warning generated
  ExampleMethodWrapper(v2) ' No warning
End Sub
于 2010-03-01T17:31:58.613 に答える