在方法调用VB.NET上将Byref切换为Byval

Pea*_*wer 3 vb.net byref byval

在方法调用上将Byref切换为Byval

由于以下原因,我提出了许多警告:

"将'ByRef'参数zzzz的值复制回匹配参数时,从xxxx到yyyy的隐式转换."

我的感觉是将函数参数从byref更改为byval是安全的,因为这些方法中的引用类型指针没有什么特别之处,引用类型只是被使用,我认为如果运行,行为将完全相同用副本指针而不是原始指针.

另一个考虑因素是我有两个继承自基类的类.同样的情况正在发生,因为byref参数导致从基类到较窄的具体类的隐式转换.再一次,我看不到运行byval的代码有任何问题.

在处理引用类型时,有没有人有关于函数中参数使用的任何提示?

我项目中当前正在传递的一些其他内容是数据库连接对象,即OracleConnection和SqlConnection.是否有任何理由将这些传递给byref?

例1

在将"ByRef"参数"value"的值复制回匹配参数时,从"Object"到"Integer"的隐式转换.

来电代码:

cmd = New SqlCommand()

cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue))
Run Code Online (Sandbox Code Playgroud)

功能:

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
Run Code Online (Sandbox Code Playgroud)

例2

在将'ByRef'参数'reader'的值复制回匹配参数时,从'System.Data.IDataReader'到'System.Data.SqlClient.SqlDataReader'的隐式转换.

来电代码:

Dim reader As new SqlDataReader

ReleaseReader(reader)
Run Code Online (Sandbox Code Playgroud)

方法:

    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
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 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
Run Code Online (Sandbox Code Playgroud)