Pregunta

El cambio BYREF a BYVAL en llamadas de método

Me han planteado muchas advertencias debido a:

"conversión implícita de xxxx a aaaa en copiar el valor de 'ByRef' parámetro zzzz de vuelta al argumento coincidente."

Mi sensación es que sería seguro para cambiar los parámetros de la función de byref a ByVal como nada especial se está haciendo con los punteros de tipo de referencia dentro de estos métodos están siendo utilizados simplemente los tipos de referencia y creo que el comportamiento sería exactamente el mismo si se ejecuta una copia de un puntero en lugar del original.

Otra consideración es que tengo dos clases que heredan de una clase base. La misma situación se está produciendo en que los params ByRef están causando la conversión implícita de la clase base para la clase concreta más estrecho. Una vez más no puedo ver ningún problema con este código que se ejecuta ByVal tampoco.

¿Alguien tiene algún consejo acerca del uso de parámetros en funciones cuando se trata de los tipos de referencia?

Algunas de las otras cosas que se están pasando actualmente en torno a byref en mi proyecto son objetos de conexión de base de datos, es decir OracleConnection y SqlConnection. ¿Hay alguna buena razón para pasar estos en todo byref?

Ejemplo 1

conversión implícita de 'Object' a 'Integer' en copiar el valor del parámetro 'ByRef' 'valor' de vuelta al argumento coincidente.

Código de llamada:

cmd = New SqlCommand()

cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue))

Función:

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

Ejemplo 2

conversión implícita de 'System.Data.IDataReader' a 'System.Data.SqlClient.SqlDataReader' en copiar el valor del parámetro 'ByRef' 'lector de atrás al argumento coincidente.

Código de llamada:

Dim reader As new SqlDataReader

ReleaseReader(reader)

Método:

    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
¿Fue útil?

Solución

Cuando se define un método en VB.Net, C # o para el caso, el que debe pasar parámetros por valor (ByVal) a menos que usted necesita para tomar ventaja de la semántica ByRef. Si no va a resetear el valor del parámetro en el método, entonces sin duda convertirlas en las llamadas ByVal.

Si está reseting la referencia pero no tomar ventaja de ella desde el sitio llamado entonces me gustaría escribir un método de ayuda que tiene el parámetro ByVal y llamadas en el único tomarlo ByRef. Esto eliminará la advertencia porque el código resultante no será objeto de reducir los errores de conversión.

Por ejemplo:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top