.NETにはプロパティの既定値を設定するDefaultValueAttributeという属性が用意されています。
カスタムコントロールなどを作成する際に、プロパティの既定値をDefaultValue属性で指定することができます。
DefaultValue属性が指定されているプロパティは、Visual Studioのデザイナーのプロパティウィンドウ(プロパティグリッド)で変更の有無を確認することができます。(プロパティの値が変更されている場合は太字で表示されます。)
上記の例ではReadOnlyプロパティの値を既定値のFalseからTrueに変更しています。
また、DefaultValue属性を指定されているプロパティでは、コードジェネレーターがプロパティの値をマークアップ(InitializeComponent)に記述するかどうかを判断します。
コードジェネレーターは、既定値以外の値が指定されているプロパティのコードを生成してマークアップに記述します。
ReadOnlyプロパティの例であれば、Falseが指定されている場合はコードは生成されず、Trueが指定されている場合にのみ
1 |
textBox.ReadOnly = true; |
コードが生成されて記述されます。
DefaultValueAttributeへ定数値を指定
数値、論理値、文字列値などの定数値は、DefaultValue属性にリテラルで指定することができます。
1 2 3 4 5 6 7 8 9 10 11 |
// 数値(int型)の場合「既定値: 0」 [DefaultValue(0)] public int IntegerProperty { get; set; } // 論理値(bool型)の場合「既定値: false」 [DefaultValue(false)] public bool BooleanProperty { get; set; } // 文字列値(string型)の場合「既定値: 空文字列」 [DefaultValue("")] public string StringProperty { get; set; } |
DefaultValueAttributeへクラス、構造体、列挙型を指定
プリミティブ型などの値は、DefaultValue属性に直接リテラルで指定できますが、System.Drawing名前空間のColor構造体やFontクラス、Size構造体などの値は、直接リテラルで指定することができません。
1 2 |
// × 以下のようには指定できない [DefaultValue(Color.Red)] |
Color構造体やFontクラスなどのオブジェクトの既定値を設定する場合は、Type(型)と値を表す文字列をDefaultValue属性に指定します。
具体的には以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Color型の場合「既定値: 青」 [DefaultValue(typeof(Color), "Blue")] public Color ColorProperty { get; set; } // Color構造体のDefaultValue属性の記述ではRGBでも指定可能 /* [DefaultValue(typeof(Color), "0, 0, 255")] public Color ColorProperty { get; set; } */ // Font型の場合「既定値: MS ゴシック 10ポイント」 [DefaultValue(typeof(Font), "MS ゴシック, 10pt")] public Font FontProperty { get; set; } // Size型の場合「既定値: 幅400, 高さ300」 [DefaultValue(typeof(Size), "400, 300")] public Size SizeProperty { get; set; } |
DefaultValue属性の1つ目のパラメーターにtypeof演算子を使用してデータの型(Type)を指定します。2つ目のパラメーターにはデザイナーのプロパティグリッドに表示される文字列と同様の値を指定します。
パラメーターを2つ指定する形式のDefaultValue属性の指定は、int型、bool型などのプリミティブ型やstring型でも使用できます。
1 2 3 4 5 6 7 8 9 10 11 |
// 数値(int型)の場合「既定値: 1」 [DefaultValue(typeof(int), "1")] public int IntegerProperty { get; set; } // 論理値(bool型)の場合「既定値: true」 [DefaultValue(typeof(bool), "True")] public bool BooleanProperty { get; set; } // 文字列値(string型)の場合「既定値: ABC」 [DefaultValue(typeof(string), "ABC")] public string StringProperty { get; set; } |
DefaultValue属性 補足
DefaultValue属性は既定値の設定を行うものですが、初期値を設定するものではありません。
ですので、DefaultValue属性を適用したプロパティが、実行時に既定値をデフォルト値としてプロパティの値が初期化されるわけではありません。
プロパティの初期値を設定する場合は、コンストラクタなどで値を設定して初期化してください。