W Visual Basic właściwość (Property) może być zadeklarowana na dwa sposoby:
' Automatyczna właściwość Public Property Name As String ' Pełna właściwość 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("Wiek nie może być ujemny") _age = value End Set End Property
Niuanse przy użyciu Set:
Value to pseudoparametr, który odnosi się do przypisywanej wartości.Set można przeprowadzać walidację, logowanie, uruchamianie zdarzeń.Kiedy używać:
Jakie są konsekwencje błędu przy pisaniu
Set(ByVal value As Integer)zamiastSet(value As Integer)w VB.NET? Dlaczego nie warto tak pisać?
Odpowiedź:
Składnia VB.NET nie wymaga (i nie wspiera) jawnego deklarowania parametru ByVal w Set — używaj po prostu Set(value As Type). Jeśli napiszesz Set(ByVal value As Integer), doprowadzi to do błędu kompilacji.
Przykład błędnego kodu:
'Set(ByVal value As Integer) — błąd kompilacji Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
W klasycznym VB6 taka składnia była dopuszczalna, ale w VB.NET wymagana jest dokładnie Set(value As Type).
Historia
ByVal w Set — kompilator zgłaszał tajemnicze błędy, których długo nie mogli zlokalizować, ponieważ linters nie pokazywał wyraźnej przyczyny.Historia
Historia
Przy kopiowaniu obiektów referencyjnych przez automatyczne właściwości zapomniano zaimplementować deep copy przez Get/Set. W rezultacie otrzymano duplikaty referencji do tego samego obiektu; zmiana w jednej instancji prowadziła do zmiany w drugiej.