Definieren von Standardwerten mit der ShouldSerialize-Methode und der Reset-Methode

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 das DefaultValueAttribute anwenden und stattdessen den Standardwert an den Attributklassenkonstruktor übergeben. Beide Mechanismen aktivieren die folgenden Funktionen des Designers:

  • Die Eigenschaft zeigt im Eigenschaftenbrowser an, wenn ihr Standardwert geändert wurde.

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

  • Der Designer generiert effizienteren Code.

Hinweis

Wenden Sie entweder das DefaultValueAttribute an, oder stellen Sie die Methoden ResetEigenschaftsname und ShouldSerializeEigenschaftsname bereit. Verwenden Sie nicht beides.

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

Die Methode ResetPropertyName legt eine Eigenschaft auf ihren Standardwert fest, wie im folgenden Codefragment gezeigt.

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

Hinweis

Wenn eine Eigenschaft keine Reset-Methode besitzt, nicht mit einem DefaultValueAttribute gekennzeichnet ist und keinen Standardwert in ihrer Deklaration aufweist, ist die Reset-Option für diese Eigenschaft im Kontextmenü des Fensters Eigenschaften des Windows Forms-Designers in Visual Studio deaktiviert.

Designer wie Visual Studio überprüfen anhand der Methode ShouldSerializePropertyName, ob eine Eigenschaft von ihrem Standardwert abweicht, und schreiben nur dann Code in das Formular, wenn eine Eigenschaft geändert wurde. Dies ermöglicht eine effizientere Codegenerierung. 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;
}

Tipp

Wenn Sie dauerhaft verhindern möchten, dass eine Eigenschaft durch den Designer serialisiert wird, fügen Sie das Attribut DesignerSerializationVisibility mit dem Wert Hidden hinzu.

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 zeigt der Eigenschaftenbrowser auch dann nicht null an, wenn der Wert der privaten Variablen, auf die die Eigenschaft MyFont zugreift, null lautet. Stattdessen wird die Eigenschaft Font des übergeordneten Objekts angezeigt, wenn sie nicht null lautet, oder der in Control definierte Standardwert für Font. Daher kann der Standardwert für MyFont nicht einfach festgelegt werden, und auf diese Eigenschaft kann kein DefaultValueAttribute angewendet werden. Stattdessen müssen die Methoden ShouldSerialize und Reset für die Eigenschaft MyFont implementiert werden.

Weitere Informationen