3 Stimmen

Referenzen in VB.NET

Etwas unklar sind mir Verweise (Pointers?) auf Klassen in VB.NET. Die Frage, die ich stellen möchte, kann durch ein wenig Testen beantwortet werden, aber ich frage mich, ob jemand eine anständige Erklärung (oder Links, auch) posten könnte.

Wenn Sie eine Klasse erstellen:

Public Class ReferenceClass

    Private myBooleanValue As Boolean = False
    Public Property BooleanValue As Boolean
        Get
            Return myBooleanValue
        End Get
        Set(value As Boolean)
            myBooleanValue = value
        End Set
    End Property

End Class

Und dann eine Klasse, die diese Klasse tatsächlich als Eigenschaft verwendet:

Public Class UsingClass

     Private myReference As ReferenceClass
     Public Property Reference As ReferenceClass
        Get
             return myReference
         End Get
         Set(value As ReferenceClass)
             myReference = value
         End Set
     End Property

     Public Sub New(ByVal Reference As ReferenceClass)
         myReference = Reference
     End Sub

End Class

Und dann verwenden Sie es so:

Public Class RuntimeOrSomething

     Public Shared myReference As ReferenceClass
     Public Shared ReadOnly Property Reference As ReferenceClass
         Get
             If myReference Is Nothing Then myReference = new ReferenceClass()
             return myReference
         End Get
     End Property

     Public Shared Function BooleanCheck() As Boolean
         Reference.BooleanValue = True
         Dim tempClass As New UsingClass(Reference)
         tempClass.Reference.BooleanValue = False

         Return (tempClass.Reference.BooleanValue = Reference.BooleanValue)
     End Sub

     Public Shared Sub DoNothing()
          Reference.BooleanValue = True
          Dim someBoolean As Boolean = BooleanCheck

          ' Now Reference.Booleanvalue is "False"
     End Sub

End Class

Jetzt die Funktion BooleanCheck wird immer zurückkehren true obwohl die Referenz an die neue Klasse übergeben wird UsingClass "nach Wert", nicht nach Referenz. Es wird also nicht eine Kopie der Klasse erstellt, sondern die lokale Variable myReference en UsingClass verweist noch auf die Eigenschaft Reference en RuntimeOrSomething .

Wie lässt sich das elegant erklären?

0voto

spacemonkeys Punkte 1639

Wie oben gesagt, setzt das Setzen einer Objektvariablen gleich einer anderen nur den "Zeiger" auf eine Instanz desselben Objekts im Speicher, wenn Sie das Objekt klonen wollen, schauen Sie sich die Implementierung der iCloneable-Schnittstelle mit etwas wie

Public Function Clone() As Object Implements ICloneable.Clone
Return Me.MemberwiseClone()
End Function

Mit und wenn Sie das Objekt zuweisen, verwenden Sie die Klon-Methode

Dim tempClass as ReferenceClass = Reference.Clone

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X