Définition de valeurs par défaut avec les méthodes ShouldSerialize et Reset

ShouldSerialize et Reset sont des méthodes facultatives que vous pouvez fournir pour une propriété, si la propriété n’a pas de valeur par défaut simple. Si la propriété a une valeur par défaut simple, vous devez appliquer la DefaultValueAttribute valeur par défaut et fournir la valeur par défaut au constructeur de classe d’attribut à la place. L’un de ces mécanismes permet les fonctionnalités suivantes dans le concepteur :

  • La propriété fournit une indication visuelle dans le navigateur de propriétés si elle a été modifiée à partir de sa valeur par défaut.

  • L’utilisateur peut cliquer avec le bouton droit sur la propriété et choisir Réinitialiser pour restaurer la propriété à sa valeur par défaut.

  • Le concepteur génère du code plus efficace.

Remarque

Appliquez les DefaultValueAttribute méthodes PropertyName et ShouldSerializePropertyName.Reset N’utilisez pas les deux.

Lors de la déclaration d’une ou d’une ShouldSerialize méthode, utilisez le modificateur d’accèsprivate.Reset Ces méthodes sont généralement appelées par le concepteur et non par le code utilisateur.

La Resetméthode PropertyName définit une propriété sur sa valeur par défaut, comme indiqué dans le fragment de code suivant.

Private Sub ResetMyFont()
   MyFont = Nothing
End Sub
private void ResetMyFont()
{
   MyFont = null;
}

Remarque

Si une propriété n’a pas de Reset méthode, n’est pas marquée avec une DefaultValueAttributevaleur par défaut fournie dans sa déclaration, l’option Reset de cette propriété est désactivée dans le menu contextuel de la fenêtre Propriétés du Concepteur Windows Forms dans Visual Studio.

Les concepteurs tels que Visual Studio utilisent la ShouldSerializeméthode PropertyName pour case activée si une propriété a changé de sa valeur par défaut et écrit du code dans le formulaire uniquement si une propriété est modifiée, ce qui permet une génération de code plus efficace. Par exemple :

'Returns true if the font has changed; otherwise, returns false.
' The designer writes code to the form only if true is returned.
Private Function ShouldSerializeMyFont() As Boolean
   Return thefont IsNot Nothing
End Function
// Returns true if the font has changed; otherwise, returns false.
// The designer writes code to the form only if true is returned.
private bool ShouldSerializeMyFont()
{
   return thefont != null;
}

Conseil

Si vous souhaitez empêcher définitivement la sérialisation d’une propriété par le concepteur, ajoutez l’attribut DesignerSerializationVisibility avec la valeur de Hidden.

Voici un exemple de code complet.

Option Explicit
Option Strict

Imports System.Drawing
Imports System.Windows.Forms

Public Class MyControl
   Inherits Control

   ' Declare an instance of the Font class
   ' and set its default value to Nothing.
   Private thefont As Font = Nothing

   ' The MyFont property.
   Public Property MyFont() As Font
      ' Note that the Font property never
      ' returns null.
      Get
         If Not (thefont Is Nothing) Then
            Return thefont
         End If
         If Not (Parent Is Nothing) Then
            Return Parent.Font
         End If
         Return Control.DefaultFont
      End Get
      Set
         thefont = value
      End Set
   End Property

   Private Function ShouldSerializeMyFont() As Boolean
      Return thefont IsNot Nothing
   End Function

   Private Sub ResetMyFont()
      MyFont = Nothing
   End Sub
End Class
using System;
using System.Drawing;
using System.Windows.Forms;

public class MyControl : Control {
   // Declare an instance of the Font class
   // and set its default value to null.
   private Font thefont = null;

   // The MyFont property.
   public Font MyFont {
      // Note that the MyFont property never
      // returns null.
      get {
         if (thefont != null) return thefont;
         if (Parent != null) return Parent.Font;
         return Control.DefaultFont;
      }
      set {
         thefont = value;
      }
   }

   private bool ShouldSerializeMyFont()
   {
      return thefont != null;
   }

   private void ResetMyFont()
   {
      MyFont = null;
   }
}

Dans ce cas, même lorsque la valeur de la variable privée accessible par la MyFont propriété est null, le navigateur de propriétés n’affiche nullpas ; au lieu de cela, il affiche la Font propriété du parent, s’il n’est pas null, ou la valeur par défaut Font définie dans Control. Par conséquent, la valeur par défaut pour MyFont ne peut pas être simplement définie et une DefaultValueAttribute valeur ne peut pas être appliquée à cette propriété. Au lieu de cela, les ShouldSerialize méthodes doivent Reset être implémentées pour la MyFont propriété.

Voir aussi