Freigeben über


Definieren von Standardwerten mit den Methoden ShouldSerialize und Reset

ShouldSerialize und Reset sind optionale Methoden, die Sie für eine Eigenschaft bereitstellen können, wenn die Eigenschaft keinen einfachen Standardwert aufweist. Wenn die Eigenschaft über einen einfachen Standardwert verfügt, sollten Sie den DefaultValueAttribute verwenden und den Standardwert stattdessen an den Attributklassenkonstruktor übergeben. Eine dieser Mechanismen ermöglicht die folgenden Features im Designer:

  • Die Eigenschaft stellt visuelle Hinweise im Eigenschaftenbrowser bereit, wenn sie vom Standardwert geändert wurde.

  • Der Benutzer kann mit der rechten Maustaste auf die Eigenschaft klicken und Zurücksetzen auswählen, um die Eigenschaft auf den Standardwert wiederherzustellen.

  • Der Designer generiert effizienteren Code.

Anmerkung

Wenden Sie entweder die DefaultValueAttribute an, oder stellen Sie ResetPropertyName- und ShouldSerializePropertyName--Methoden bereit. Verwenden Sie nicht beide.

Verwenden Sie beim Deklarieren einer ShouldSerialize- oder Reset-Methode den private Zugriffsmodifizierer. Diese Methoden werden in der Regel vom Designer und nicht vom Benutzercode aufgerufen.

Die ResetPropertyName--Methode legt eine Eigenschaft auf den Standardwert fest, wie im folgenden Codefragment dargestellt.

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

Anmerkung

Wenn eine Eigenschaft keine Reset-Methode aufweist, nicht mit einem DefaultValueAttributegekennzeichnet ist und keinen Standardwert in der Deklaration enthält, wird die Option Reset für diese Eigenschaft im Kontextmenü des Eigenschaften--Fensters des Windows Forms Designer in Visual Studio deaktiviert.

Entwicklungsumgebungen wie Visual Studio verwenden die ShouldSerialize-PropertyName--Methode, um zu überprüfen, ob sich eine Eigenschaft von ihrem Standardwert geändert hat. Anschließend schreiben sie nur dann Code in das Formular, wenn eine Eigenschaft geändert wurde. Dies ermöglicht eine effizientere Codeerzeugung. Zum Beispiel:

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

Trinkgeld

Wenn Sie dauerhaft verhindern möchten, dass eine Eigenschaft vom Designer serialisiert wird, fügen Sie das Attribut DesignerSerializationVisibility mit dem Wert von Hiddenhinzu.

Es folgt ein vollständiges Codebeispiel.

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 diesem Fall wird selbst dann, wenn der Wert der privaten Variablen, auf den durch die MyFont-Eigenschaft zugegriffen wird, nullist, der Eigenschaftenbrowser nullnicht angezeigt; stattdessen wird die Font-Eigenschaft des übergeordneten Elements angezeigt, wenn sie nicht nullist, oder der in Controldefinierte Standardwert Font. Daher kann der Standardwert für MyFont nicht einfach festgelegt werden, und eine DefaultValueAttribute kann nicht auf diese Eigenschaft angewendet werden. Stattdessen müssen die methoden ShouldSerialize und Reset für die eigenschaft MyFont implementiert werden.

Siehe auch