メソッド呼び出しで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