Schalt ByRef zu ByVal auf Methodenaufrufe VB.NET
Frage
Schalt ByRef zu ByVal auf Methodenaufrufe
Ich habe viele Warnungen erhöht durch:
"Die implizite Konvertierung von xxxx bis yyyy in Kopieren Sie den Wert von 'ByRef' Parameter zzzz zurück auf die passende Argument."
Mein Gefühl ist, dass es sicher wäre, von byref zu byval die Funktionsparameter zu ändern, da nichts Besonderes ist mit dem Referenztyp Zeigern innerhalb dieser Methoden werden die Referenz getan Typen einfach verwendet werden, und ich denke, das Verhalten wäre genau die gleiches mit ein, wenn ausgeführt werden kopiert einen Zeiger eher als das Original.
Eine weitere Überlegung ist, dass ich zwei Klassen haben, die von einer Basisklasse erben. Die gleiche Situation wird auftreten, daß das byref params verursacht implizites Gießen von der Basisklasse mit der schmaleren konkreten Klasse. Ich kann wieder keine Probleme sehen mit diesem Code byval entweder ausgeführt wird.
Hat jemand irgendwelche Tipps Verwendung von Parametern in Funktionen in Bezug auf, wenn sie mit Referenztypen zu tun?
Einige der anderen Dinge, die zur Zeit byref in meinem Projekt herumgereicht werden, sind Datenbankverbindungsobjekte heißt OracleConnection und SqlConnection. Gibt es einen guten Grund für das Bestehen dieses um byref?
Beispiel 1
implizite Konvertierung von 'Objekt' in 'Integer' in das Kopieren der Wert von 'ByRef' parameter 'Wert' zurück zu dem passenden Argument.
Telefonvorwahl:
cmd = New SqlCommand()
cmd.Parameters.Add(CreateParameter("Alpha", SqlDbType.Int,ParameterDirection.Input, -1, AlphaValue))
Funktion:
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
Beispiel 2
implizite Konvertierung von 'System.Data.IDataReader' to 'System.Data.SqlClient.SqlDataReader' in das Kopieren der Wert von 'ByRef' parameter 'reader' zurück zu dem passenden Argument.
Telefonvorwahl:
Dim reader As new SqlDataReader
ReleaseReader(reader)
Methode:
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
Lösung
Wenn Sie eine Methode in VB.Net definiert, oder C # für diese Angelegenheit, die Sie Parameter nach Wert übergeben sollte (ByVal), es sei denn Sie die Vorteile von ByRef Semantik nehmen müssen. Wenn Sie nicht den Parameterwert innerhalb der Methode Reseting werden dann drehen definitiv diese in ByVal Anrufe.
Wenn Sie die Referenz sind Reseting aber nicht nutzt es aus der Aufrufstelle nehmen, dann würde ich eine Hilfsmethode schreiben, die die Parameter ByVal und Anrufe in die einem ByRef nimmt es dauert. Dies wird die Warnung entfernen, da der resultierende Code nicht unterliegen werden Konvertierungsfehler zu verengen.
Zum Beispiel:
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