La classe attributo DefaultValueAttribute permette di dare un valore di default ad una proprietà di uno user-control. Come disse Corrado in uno workshop di parecchio tempo fa, è importante specificarla, perchè evitiamo a Visual Studio di serializzare quella proprietà nella InitializeComponent() della Windows Forms (WF) che stiamo editando. Mi spiego meglio.
Supponiamo di avere una WF con un controllo MyControl che espone una proprietà pubblica Enabled di tipo bool. Se a design-time impostiamo questa proprietà a true, nella InitializeComponent() ci troveremo una riga simile a questa:
MyControl.Enabled = true;
In modo analogo se impostiamo questa proprietà a false. Ma se impostiamo l'attributo DefaultValue su questa proprietà, Visual Studio eviterà di manipolare la InitializeComponent() serializzando una riga di codice superflua, cosa che accade quando la proprietà vale esattamente come il default value stabilito nell'attributo. Anche se non ce ne rendiamo conto, abbiamo a che fare con DefaultValue molto spesso: se siete in design-time e state modificando una qualsiasi proprietà di un qualsiasi oggetto (banalmente, un controllo), il valore di tale proprietà è scritto in grassetto quando è diverso dal default value. Se non è in grassetto, il valore è esattamente uguale al default value.
Arriviamo ad un caso concreto. Supponiamo di realizzare uno user control che espone una proprietà di tipo double chiamata IntervalRolling. Vogliamo attribuire un valore di default a tale proprietà, per cui scriviamo quanto segue:
[DefaultValue(2000)]
public double IntervalRolling
{
get { return (_internalTimer.Interval); }
set { _internalTimer.Interval = value; }
}
La variabile privata _internalTimer è un oggetto System.Timers.Timer. La cosa che non mi quadrava è il motivo per cui continuavo a vedere il valore 2000 in grassetto nella Property Window, una volta che mettevo il mio user control su un container qualsiasi.
Mi dicevo: se imposto IntervalRolling = 2000, e 2000 è il valore di default, perchè tu non lo riconosci ed insisti a scrivermelo in grassetto e - peggio - mi serializzi sempre la riga nel codice sorgente della InitializeComponent()?
La risposta è molto semplice. Non ci ho messo molto a trovarla, ma credo che possa capitare ad altri in altre circostanze e sono fiducioso in Google che aiuterà le persone a finire su questo post. Scritto così com'è, [DefaultValue(2000)] considera il valore 2000 come int, mentre la mia proprietà è di tipo double. Il modo corretto di specificare il default value è di indicare 2000D, che casta il valore 2000 a double, cioè lo stesso tipo della proprietà a cui si applica l'attributo DefaultValue.
Adesso se imposto 2000, il valore non mi appare in grassetto e la riga di codice non viene serializzata! Bueno!