使用 ShouldSerialize 和 Reset 方法定义默认值

如果属性没有简单的默认值,ShouldSerializeReset 是可以为属性提供的可选方法。 如果属性有一个简单的默认值,则应改为应用 DefaultValueAttribute,并将默认值提供给属性类构造函数。 这两种机制都支持设计器中的以下功能:

  • 如果已将属性的值修改为非默认值,则该属性会在属性浏览器中提供视觉指示。

  • 用户可以右键单击该属性,然后选择“重置”,将属性还原为其默认值

  • 设计器生成更高效的代码。

注意

应用 DefaultValueAttribute 或提供 ResetPropertyName 和 ShouldSerializePropertyName 方法。 请勿同时使用两者。

声明 ShouldSerializeReset 方法时,请使用 private 访问修饰符。 这些方法通常由设计器调用,而不是由用户代码调用。

ResetPropertyName 方法将属性设置为其默认值,如以下代码片段所示。

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

注意

如果属性没有 Reset 方法,没有用 DefaultValueAttribute 标记,并且没有在其声明中提供默认值,则该属性的 Reset 选项在 Visual Studio 中 Windows 窗体设计器的“属性”窗口的快捷菜单中禁用

Visual Studio 等设计器使用 ShouldSerializePropertyName 方法检查属性是否已更改为非默认值,并且仅在属性发生更改时才将代码写入窗体,从而生成更高效的代码。 例如:

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

提示

如果要永久阻止设计器序列化属性,请添加值为 HiddenDesignerSerializationVisibility 特性。

以下是完整的代码示例。

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 属性(如果它不是 nullControl 中定义的默认 Font 值)。 因此,不能简单地设置 MyFont 的默认值,并且不能将 DefaultValueAttribute 应用于此属性。 取而代之的是,必须为 MyFont 属性实现 ShouldSerializeReset 方法。

另请参阅