ProgrammationDéveloppeur VB.NET, développeur d'applications métiers

Expliquez la différence entre les propriétés (Properties) avec des blocs complets Get/Set et les propriétés auto-implémentées, ainsi que les subtilités de l'utilisation de Value à l'intérieur de Set.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Visual Basic, une propriété (Property) peut être déclarée de deux manières :

  • Propriété complète (avec des blocs Get/Set propres) : permet de contrôler l'accès aux données, d'effectuer des vérifications supplémentaires ou des actions lors de la lecture/de l'écriture de la valeur.
  • Propriété automatique (auto-implémentée) : notation abrégée où Get/Set ne sont pas écrits explicitement, et un champ privé est automatiquement créé :
' 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 :

  • Le mot clé Value est une pseudo-variable qui fait référence à la valeur assignée.
  • À l'intérieur de Set, on peut effectuer une validation, une journalisation, déclencher des événements.
  • Modifier un champ anonyme lors de la mise en œuvre automatique ne peut pas être contrôlé.

**Quand utiliser : **

  • Propriétés automatiques — lorsque l'on a besoin d'un simple "conteneur".
  • Propriétés complètes — lorsque la logique est requise lors de la définition/de l'obtention (validation, notification, calculs).

Question piège.

Quelle est la conséquence d'une erreur lors de l'écriture de Set(ByVal value As Integer) au lieu de Set(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

Lors d'un grand projet de transfert automatique de code de VB6 à VB.NET, 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

Dans un projet traitant de grands ensembles de données, des propriétés automatiques ont été utilisées pour stocker des données, puis un problème est survenu : il fallait suivre si la propriété changeait pour journaliser automatiquement chaque changement. Il a été nécessaire de remplacer les propriétés automatiques par des propriétés complètes — au final, beaucoup de temps a été perdu sur le refactorisation, car au départ, il n'avait pas été pris en compte qu'une logique supplémentaire pourrait être nécessaire dans Set.

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.