Passaggio byref a ByVal su chiamate di metodo VB.NET
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
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