Definizione dei valori predefiniti utilizzando i metodi ShouldSerialize e Reset

ShouldSerialize e Reset sono metodi facoltativi che è possibile fornire per una proprietà, se la proprietà non ha un valore predefinito semplice. Se la proprietà ha un valore predefinito semplice, è necessario applicare e DefaultValueAttribute fornire il valore predefinito al costruttore della classe di attributi. Uno di questi meccanismi abilita le funzionalità seguenti nella finestra di progettazione:

  • La proprietà fornisce indicazioni visive nel browser delle proprietà se è stata modificata dal valore predefinito.

  • L'utente può fare clic con il pulsante destro del mouse sulla proprietà e scegliere Reimposta per ripristinare il valore predefinito della proprietà.

  • La finestra di progettazione genera codice più efficiente.

Nota

Applicare o specificare Reseti DefaultValueAttribute metodi PropertyName eShouldSerialize PropertyName. Non usare entrambi.

Quando si dichiara un ShouldSerialize metodo o Reset , usare il private modificatore di accesso. Questi metodi vengono in genere richiamati dalla finestra di progettazione e non dal codice utente.

Il Resetmetodo PropertyName imposta una proprietà sul valore predefinito, come illustrato nel frammento di codice seguente.

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

Nota

Se una proprietà non dispone di un Reset metodo, non è contrassegnata con un DefaultValueAttributee non dispone di un valore predefinito specificato nella relativa dichiarazione, l'opzione Reset per tale proprietà è disabilitata nel menu di scelta rapida della finestra Proprietà di Progettazione Windows Form in Visual Studio.

Le finestre di progettazione, ad esempio Visual Studio, usano il ShouldSerializemetodo PropertyName per verificare se una proprietà è stata modificata rispetto al valore predefinito e scrivere codice nel modulo solo se viene modificata una proprietà, consentendo così una generazione di codice più efficiente. Ad esempio:

'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;
}

Suggerimento

Se si desidera impedire in modo permanente la serializzazione di una proprietà dalla finestra di progettazione, aggiungere l'attributo DesignerSerializationVisibility con il valore di Hidden.

Di seguito è riportato un esempio di codice completo.

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;
   }
}

In questo caso, anche quando il valore della variabile privata a cui si accede dalla MyFont proprietà è null, il browser delle proprietà non visualizza null; visualizza invece la Font proprietà dell'elemento padre, se non nullè o il valore predefinito Font definito in Control. Di conseguenza, il valore predefinito per MyFont non può essere semplicemente impostato e non DefaultValueAttribute può essere applicato a questa proprietà. Al contrario, i ShouldSerialize metodi e Reset devono essere implementati per la MyFont proprietà .

Vedi anche