Definir valores predeterminados con los métodos ShouldSerialize y Reset

ShouldSerialize y Reset son métodos opcionales que puede proporcionar para una propiedad, si la propiedad no tiene un valor predeterminado simple. Si la propiedad tiene un valor predeterminado simple, debe aplicar DefaultValueAttribute y proporcionar el valor predeterminado al constructor de la clase de atributos en su lugar. Cualquiera de estos mecanismos habilita las siguientes características en el diseñador:

  • La propiedad proporciona una indicación visual en el explorador de propiedades si se ha modificado a partir de su valor predeterminado.

  • El usuario puede hacer clic con el botón derecho en la propiedad y elegir Restablecer para restaurar la propiedad a su valor predeterminado.

  • El diseñador genera código más eficaz.

Nota:

Aplique DefaultValueAttribute o proporcione los métodos ResetPropertyName y ShouldSerializePropertyName. No use ambos.

Cuando declare un método ShouldSerialize o Reset, utilice el modificador de acceso private. Estos métodos suelen invocarse por el diseñador y no por el código del usuario.

El método ResetPropertyName establece una propiedad en su valor predeterminado, como se muestra en el siguiente fragmento de código.

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

Nota:

Si una propiedad no tiene un método Reset, no está marcado con DefaultValueAttribute y no tiene un valor predeterminado proporcionado en su declaración, la opción Reset para esa propiedad está deshabilitada en el menú contextual de la ventana Propiedades del Diseñador de Windows Forms en Visual Studio.

Los diseñadores como Visual Studio usan el método ShouldSerializePropertyName para comprobar si una propiedad ha cambiado de su valor predeterminado y escribir código en el formulario solo si se cambia una propiedad, lo que permite generar código más eficaz. Por ejemplo:

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

Sugerencia

Si quiere evitar permanentemente que el diseñador serialice una propiedad, agregue el atributo DesignerSerializationVisibility con el valor Hidden.

A continuación se muestra un ejemplo de código 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;
   }
}

En este caso, incluso cuando el valor de la variable privada a la que accede la propiedad MyFont sea null, el explorador de propiedades no muestra null; en su lugar, muestra la propiedad Font del elemento primario, si no es null, o el valor predeterminado Font definido en Control. Por lo tanto, el valor predeterminado de MyFont no se puede establecer simplemente y no se puede aplicar DefaultValueAttribute a esta propiedad. En su lugar, los métodos ShouldSerialize y Reset deben implementarse para la propiedad MyFont.

Consulte también