2010-03-01 46 views
3

的方法轉換爲ByRef到BYVAL來電切換到的ByRef BYVAL在方法調用VB.NET

我已經由於許多警告提出:從XXXX到YYYY在抄襲「的ByRef值

「隱式轉換'參數zzzz回到匹配的參數。「

我的感覺是,將函數參數從byref更改爲byval是安全的,因爲這些方法中的引用類型指針沒有什麼特別的做法,引用類型只是被使用,我認爲行爲將是完全正確的如果使用複製指針而不是原始指針運行,則是相同的。

另一個考慮是我有兩個類從基類繼承。同樣的情況發生在byref參數正在引發從​​基類到狹義的具體類的隱式轉換。再次,我看不到用這個代碼運行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'參數'reader'的值複製回匹配的參數。

呼叫號碼:

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 
+0

你可以提供一個代碼示例,將重現相同的警告?改變'ByRef' /'ByVal'參數可能會清除警告,但不是最好的解決方案。 – STW 2010-03-01 17:31:25

回答

5

當在VB.Net定義的方法,或C#對於這個問題,在你應該值(BYVAL),除非傳遞參數你需要利用ByRef語義。如果你沒有重新設置方法中的參數值,那麼一定要把它們變成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 
+0

這看起來很不錯 – PeanutPower 2010-03-01 20:53:20