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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top