Condividi tramite


Definizione dei valori predefiniti con 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 il DefaultValueAttribute e specificare invece il valore predefinito al costruttore della classe di attributi. Uno di questi meccanismi abilita le funzionalità seguenti nella finestra di progettazione:

  • La proprietà fornisce un'indicazione visiva nel browser delle proprietà se è stata modificata rispetto al suo 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à.

  • Il designer genera codice più efficiente.

Nota

Applicare il DefaultValueAttribute o fornire i metodi ResetPropertyName e ShouldSerializePropertyName. Non usare entrambi.

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

Il metodo ResetPropertyName 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 metodo Reset, non è contrassegnata con un DefaultValueAttributee non dispone di un valore predefinito specificato nella dichiarazione, l'opzione Reset per tale proprietà è disabilitata nel menu di scelta rapida nella finestra Proprietà della Progettazione dei Windows Form in Visual Studio.

Progettisti come Visual Studio usano il metodo ShouldSerializePropertyName per verificare se una proprietà è stata modificata rispetto al valore predefinito e scrivere il codice nel form solo se una proprietà è stata modificata, consentendo così una generazione di codice più efficiente. Per 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 .

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 proprietà MyFont è null, il browser delle proprietà non visualizza null; Visualizza invece la proprietà Font dell'elemento padre, se non è nullo il valore Font predefinito definito in Control. Pertanto, il valore predefinito per MyFont non può essere semplicemente impostato e non è possibile applicare un DefaultValueAttribute a questa proprietà. È invece necessario implementare i metodi ShouldSerialize e Reset per la proprietà MyFont.

Vedere anche