在方法调用转换为ByRef到BYVAL VB.NET
题
上的方法调用转换为ByRef到BYVAL
我许多警告提出由于:
“从XXXX到YYYY隐式转换中复制的值为‘ByRef’参数ZZZZ回匹配的参数。”
我的感觉是,如无特殊正在用这些方法只是正在使用的引用类型内引用类型指针做这将是安全的,从按地址改变功能参数BYVAL,我认为行为是完全相同的,如果与正在运行的复制指针而不是原来的。
另一个考虑是,我有从基类继承两个类。同样的情况是发生在该按地址PARAMS从基类引起的隐式转换到更窄的具体类。再次看不到与运行BYVAL任一此代码的任何问题。
没有人有引用类型处理时关于使用的函数参数的任何提示?
一些目前正在在我的项目通过各地按地址的其他事情是数据库连接对象即的OracleConnection和SqlConnection的。有没有什么好的理由通过这些各地按地址?
实施例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)的参数。如果您没有在方法中正在重置的参数值,那么一定把这些变成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
不隶属于 StackOverflow