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

如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。 如果属性具有简单的默认值,则应用 DefaultValueAttribute 并将默认值提供给特性类构造函数。 上述机制中的任何一种都可以在设计器中启用下列功能:

  • 该属性在修改了其默认值的情况下,在属性浏览器中提供可视化表示。

  • 用户可以右击该属性并选择**“重置”**将该属性还原为其默认值。

  • 该设计器生成更为有效的代码。

    提示

    可以应用 DefaultValueAttribute 或提供 Reset属性名 和 ShouldSerialize属性名 方法。 但两者不能同时使用。

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

Public Sub ResetMyFont()
   MyFont = Nothing
End Sub
public void ResetMyFont() {
   MyFont = null;
}

提示

如果属性没有 Reset 方法,未用 DefaultValueAttribute 进行标记,而且在其声明中不提供默认值,那么该属性的 Reset 选项将在 Visual Studio 的 Windows 窗体设计器“属性”窗口的快捷菜单中被禁用。

诸如 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.
Public Function ShouldSerializeMyFont() As Boolean
   Return Not (thefont Is 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.
public bool ShouldSerializeMyFont() {
   return thefont != null;
}

完整的代码示例如下。

Option Explicit
Option Strict

Imports System
Imports System.Windows.Forms
Imports System.Drawing

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
   
   Public Function ShouldSerializeMyFont() As Boolean
      Return Not (thefont Is Nothing)
   End Function
   
   Public Sub ResetMyFont()
      MyFont = Nothing
   End Sub
End Class
using System;
using System.Windows.Forms;
using System.Drawing;

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

   public bool ShouldSerializeMyFont() {
      return thefont != null;
   }
 
   public void ResetMyFont() {
      MyFont = null;
   }
}

在本例中,即使由 MyFont 属性访问的私有变量的值为 null,属性浏览器也不会显示 null,它显示的是父级的 Font 属性(如果该属性不为 null),或者是在 Control 中定义的 Font 的默认值。 这样就不能简单地设置 MyFont 的默认值,并且不能对该属性应用 DefaultValueAttribute, 而是必须为 MyFont 属性实现 ShouldSerialize 和 Reset 方法。

请参见

概念

在 Windows 窗体控件中定义属性

属性更改事件

其他资源

Windows 窗体控件中的属性