メソッド呼び出しにBYVALにBYREFの切り替えVB.NET
質問
メソッド呼び出しにBYVALにBYREFの切り替え
私は多くの警告を持っていることによる調達
「の値をコピーでYYYYにXXXXからの暗黙の変換 『のByRef』パラメータZZZZバックマッチング引数。」
私の気持ちは、何も特別なは参照型を単純に使用されているこれらのメソッド内の参照型ポインタで行われていると私は行動が正確だと思うようにはBYVALへのByRefから関数のパラメータを変更しても安全だろうということですそれを実行している場合は、元のではなく、ポインタをコピーします。
もう1つの考慮事項は、私は基本クラスから継承する2つのクラスを持っているということです。同じ状況がByRefのparamsはより狭いコンクリートクラスに基本クラスから暗黙的なキャスティングを引き起こしていることで発生しています。再び私は、このコードは、どちらかBYVAL実行中に問題が表示されないことができます。
ん誰参照型を扱うとき?関数のパラメータの使用に関する任意のヒントを持っている。
現在、私のプロジェクトでByRefの周りに渡されている他のものの中には、データベース接続オブジェクト、すなわちOracleConnectionのとSqlConnectionのです。 ByRefのこれらの周りを渡すために何か良い理由がありますか?
実施例1
「のByRef」パラメータバックマッチング引数に「値」の値をコピーすることで「整数」と「オブジェクト」からの暗黙の変換の
電話番号:
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)
の暗黙の変換から「System.Data.IDataReader」から「System.Data.SqlClient.SqlDataReader」「のByRef」パラメータバックマッチング引数に「リーダー」の値をコピーする。の
電話番号:
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
解決
は、値(ByValの)によってパラメータを渡す必要があります。あなたはメソッド内のパラメータ値をresetingされていない場合は、間違いなくByValの呼び出しにこれらを回します。
あなたが参照をresetingが、その後、私はそれをByRefの服用一つにパラメータのByValと電話を取るヘルパーメソッドを記述し、コールサイトからの利点を取っていない場合。結果として得られるコードは、変換誤差を狭めるを受けることがないので、これは警告を削除します。
例えば、
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