Domanda

Passaggio ByRef a ByVal sulle chiamate di metodo

Ho molti avvertimenti sollevate a causa di:

"conversione implicita da xxxx fino a yyyy nel copiare il valore del parametro 'ByRef' zzzz torna all'argomento corrispondente."

La mia sensazione è che sarebbe sicuro di modificare i parametri della funzione da byref a ByVal come niente di speciale è stato fatto con i puntatori di tipo di riferimento all'interno di questi metodi i tipi di riferimento sono semplicemente utilizzati e credo che il comportamento sarebbe esattamente il stesso se si esegue una copia di un puntatore piuttosto che l'originale.

Un'altra considerazione è che ho due classi che ereditano da una classe base. La stessa situazione si sta verificando in che i params ByRef stanno causando il cast implicito dalla classe base alla classe di calcestruzzo più stretto. Ancora una volta non riesco a vedere alcun problema con questo codice in esecuzione ByVal sia.

Qualcuno ha qualche consiglio per quanto riguarda l'uso di parametri nelle funzioni quando si tratta di tipi di riferimento?

Alcune delle altre cose che sono attualmente in passato in giro byref nel mio progetto sono oggetti di connessione al database cioè OracleConnection e SqlConnection. C'è qualche buona ragione per il passaggio di questi intorno byref?

Esempio 1

conversione implicita da 'Oggetto' a 'Integer' nel copiare il valore del parametro 'ByRef' 'valore' di nuovo all'argomento corrispondente.

Prefisso telefonico internazionale:

cmd = New SqlCommand()

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

funzione:

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

Esempio 2

conversione implicita da 'System.Data.IDataReader' a 'System.Data.SqlClient.SqlDataReader' nel copiare il valore del parametro 'ByRef' 'lettore' di nuovo l'argomento corrispondente.

Prefisso telefonico internazionale:

Dim reader As new SqlDataReader

ReleaseReader(reader)

Metodo:

    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
È stato utile?

Soluzione

Quando si definisce un metodo in VB.Net, C # o per quella materia, la si dovrebbe passare parametri per valore (ByVal) a meno che non è necessario per sfruttare la semantica ByRef. Se non si è resettare il valore del parametro all'interno del metodo quindi sicuramente trasformare questi in chiamate ByVal.

Se si resettare il riferimento, ma non sfruttando dal sito chiamata poi avrei scritto un metodo di supporto che prende il parametro ByVal e mette in quello prenderlo ByRef. Questo eliminerà l'avviso perché il codice risultante non sarà soggetta a ridurre errori di conversione.

Ad esempio:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top