質問

メソッド呼び出しに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
役に立ちましたか?

解決

そのことについてはVB.Net、またはC#のメソッドを定義するときは、ByRefのセマンティクスを活用するために必要がある場合を除き、

は、値(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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top