Определение значений по умолчанию с помощью методов ShouldSerialize и Reset

ShouldSerialize и Reset — это необязательные методы, которые можно указать для свойства, если оно не имеет простого значения по умолчанию. Если у свойства есть простое значение по умолчанию, следует применить DefaultValueAttribute и предоставить значение по умолчанию конструктору класса атрибутов. Оба этих механизма обеспечивают указанные ниже возможности в конструкторе.

  • В обозревателе свойств обозначено, было ли изменено значение свойства по умолчанию.

  • Пользователь может щелкнуть свойство правой кнопкой мыши и выбрать пункт Сбросить, чтобы восстановить значение свойства по умолчанию.

  • Конструктор создает более эффективный код.

Примечание.

Примените DefaultValueAttribute или предоставьте методы ResetИмяСвойства и ShouldSerializeИмяСвойства. Не используйте и то и другое.

При объявлении метода ShouldSerialize или Reset используйте модификатор доступа private. Эти методы обычно вызываются конструктором, а не пользовательским кодом.

Метод ResetИмяСвойства присваивает свойству значение по умолчанию, как показано в приведенном ниже фрагменте кода.

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

Примечание.

Если свойство не имеет метода Reset, не помечено с помощью DefaultValueAttribute и не имеет значения по умолчанию в объявлении, пункт Reset для этого свойства отключен в контекстном меню окна Свойства конструктора Windows Forms в Visual Studio.

Такие конструкторы, как Visual Studio, используют метод ShouldSerializeИмяСвойства, чтобы проверить, изменилось ли значение свойства по умолчанию, и добавляют код в форму только в том случае, если свойство изменилось, что позволяет повысить эффективность создания кода. Например:

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

Совет

Чтобы полностью запретить сериализацию свойства конструктором, добавьте атрибут DesignerSerializationVisibility со значением Hidden.

Полный пример кода приведен ниже.

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

В этом случае, даже если значение частной переменной, доступ к которой осуществляется с помощью свойства MyFont, равно null, в обозревателе свойств не отображается null. Вместо этого в нем отображается свойство Font родительского объекта, если оно не равно null, или значение Font по умолчанию, определенное в Control. Таким образом, для MyFont нельзя просто задать значение по умолчанию, и к этому свойству нельзя применить DefaultValueAttribute. Вместо этого для свойства MyFont необходимо реализовать методы ShouldSerialize и Reset.

См. также