在方法调用上将Byref切换为Byval
由于以下原因,我提出了许多警告:
“将'ByRef'参数zzzz的值复制回匹配参数时,从xxxx到yyyy的隐式转换。”
我的感觉是,将函数参数从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
将'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 :(得分: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