Определение значений по умолчанию с помощью методов 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
.
См. также
.NET Desktop feedback