En Visual Basic, une propriété (Property) peut être déclarée de deux manières :
' Propriété automatique Public Property Name As String ' Propriété complète 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("L'âge ne peut pas être négatif") _age = value End Set End Property
Subtilités lors de l'utilisation de Set :
Value est une pseudo-variable qui fait référence à la valeur assignée.Set, on peut effectuer une validation, une journalisation, déclencher des événements.**Quand utiliser : **
Quelle est la conséquence d'une erreur lors de l'écriture de
Set(ByVal value As Integer)au lieu deSet(value As Integer)en VB.NET ? Pourquoi ne faut-il pas écrire ainsi ?
Réponse :
La syntaxe VB.NET ne nécessite pas (et ne supporte pas) la déclaration explicite du paramètre ByVal dans Set — utilisez simplement Set(value As Type). Si vous écrivez Set(ByVal value As Integer), cela entraînera une erreur de compilation.
Exemple de code erroné :
'Set(ByVal value As Integer) — erreur de compilation Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
Dans le classique VB6, cette syntaxe était autorisée, mais en VB.NET, il est strictement requis d'utiliser Set(value As Type).
Histoire
ByVal a été placé dans Set — le compilateur a généré des erreurs mystérieuses qui ont pris du temps à localiser, car le linter ne montrait pas de raison claire.Histoire
Histoire
Lors de la copie d'objets de type référence via des propriétés automatiques, on a oublié de réaliser une copie profonde via Get/Set. En conséquence, on obtenait la duplication de références vers le même objet ; les modifications dans un exemplaire entraînaient des modifications dans l'autre.