In Visual Basic kann eine Eigenschaft (Property) auf zwei Arten deklariert werden:
' Automatische Eigenschaft Public Property Name As String ' Vollständige Eigenschaft Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("Alter kann nicht negativ sein") _age = value End Set End Property
Nuancen bei der Verwendung von Set:
Value ist eine Pseudovariable, die auf den zugewiesenen Wert verweist.Set kann Validierung, Protokollierung, Ereignisauslösung durchgeführt werden.Wann verwenden:
Was passiert, wenn Sie
Set(ByVal value As Integer)anstelle vonSet(value As Integer)in VB.NET schreiben? Warum sollte man das nicht tun?
Antwort:
Die Syntax von VB.NET erfordert (und unterstützt) nicht die explizite Deklaration des Parameters ByVal in Set — verwenden Sie einfach Set(value As Type). Wenn Sie Set(ByVal value As Integer) schreiben, führt dies zu einem Compile-Fehler.
Beispiel für fehlerhaften Code:
'Set(ByVal value As Integer) — Compile-Fehler Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
In klassischem VB6 war solche Syntax zulässig, aber in VB.NET ist strikt Set(value As Type) erforderlich.
Geschichte
ByVal in Set verwendet — der Compiler gab rätselhafte Fehler aus, die lange nicht lokalisiert werden konnten, da der Linter keinen klaren Grund angab.Geschichte
Geschichte
Beim Kopieren von Objekten des Referenztyps über automatische Eigenschaften wurde vergessen, eine tiefe Kopie über Get/Set zu implementieren. Infolgedessen erhielten wir Duplikate von Verweisen auf dasselbe Objekt; Änderungen in einer Instanz führten zu Änderungen in der anderen.