Dela via


Definiera standardvärden med metoderna ShouldSerialize och Reset

ShouldSerialize och Reset är valfria metoder som du kan ange för en egenskap, om egenskapen inte har ett enkelt standardvärde. Om egenskapen har ett enkelt standardvärde bör du använda DefaultValueAttribute och ange standardvärdet för attributklasskonstruktorn i stället. Någon av dessa mekanismer möjliggör följande funktioner i designern:

  • Egenskapen ger visuell indikation i egenskapswebbläsaren om den har ändrats från standardvärdet.

  • Användaren kan högerklicka på egenskapen och välja Återställ för att återställa egenskapen till standardvärdet.

  • Designern genererar effektivare kod.

Anteckning

Använd antingen DefaultValueAttribute eller ange metoderna ResetPropertyName och ShouldSerializePropertyName. Använd inte båda.

När du deklarerar en ShouldSerialize- eller Reset-metod använder du private-åtkomstmodifieraren. Dessa metoder anropas vanligtvis av designern och inte av användarkod.

Metoden ResetPropertyName anger en egenskap till dess standardvärde, enligt följande kodfragment.

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

Anteckning

Om en egenskap inte har en Reset-metod, inte är markerad med en DefaultValueAttributeoch inte har något standardvärde som anges i deklarationen, inaktiveras Reset alternativet för den egenskapen i snabbmenyn i fönstret Egenskaper i Windows Forms Designer i Visual Studio.

Designers som Visual Studio använder metoden ShouldSerializePropertyName för att kontrollera om en egenskap har ändrats från standardvärdet och skriver kod i formuläret endast om en egenskap ändras, vilket möjliggör effektivare kodgenerering. Till exempel:

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

Tips

Om du vill förhindra att en egenskap serialiseras permanent av designern lägger du till attributet DesignerSerializationVisibility med värdet Hidden.

Ett komplett kodexempel följer.

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

Även när värdet av den privata variabeln som används av egenskapen MyFont är null, visas inte nulli egenskapsgranskaren. Istället visas egenskapen Font hos den överordnade, om den inte är null, eller standardvärdet för Font som definieras i Control. Därför kan standardvärdet för MyFont inte bara anges och en DefaultValueAttribute kan inte tillämpas på den här egenskapen. I stället måste metoderna ShouldSerialize och Reset implementeras för egenskapen MyFont.

Se även