最後創建的ObservationData的成員_magnitude的值是0,這 是合理的。但_whichPlanet卻是無效的。你須要讓0也是有效的(狀態)。如果可 能,選擇把0做為一個最好的默認。Planet枚舉類型沒有一個明確的默認值,無 論用戶是否任意的選擇一些行星,這都不會給人留下好的感覺。當你陷入這樣的 情況時,使用0做為一個非初始化的值,這也是在後面可以更新的:
public enum Planet
{
None = 0,
Mercury = 1,
Venus = 2,
Earth = 3,
Mars = 4,
Jupiter = 5,
Saturn = 6,
Neptune = 7,
Uranus = 8,
Pluto = 9
}
Planet sphere = new Planet ();
此時,sphere具有一個(默認)值None。為Planet枚舉類型添 加的這個非初始化的默認值,對ObservationData結構。最新創建的 ObservationData對象的目標上具有None和一個數值0。添加一個清晰的構造函數 讓用戶為你的類型的所有字段明白的初始化:
public struct ObservationData
{
Planet _whichPlanet; //what am I looking at?
Double _magnitude; // perceived brightness.
ObservationData( Planet target,
Double mag )
{
_whichPlanet = target;
_magnitude = mag;
}
}
但請記住,默認的構造函數還是可訪問的,而且是結構的部份。 用戶還是可以創建一個系統初始化的變量,而你無法阻止它。
在結束枚 舉類型轉而討論其它類型之前,你須要明白幾個用於標記的特殊枚舉類型規則。 枚舉類型在使用Flags特性時,必須把None的值設置為0:
[Flags]
public enum Styles
{
None = 0,
Flat = 1,
Sunken = 2,
Raised = 4,
}
很多開發 人員使用枚舉標記和位運算操作AND進行運行,0值會與位標記產生嚴重的問題。 下面這個實驗如果Flat的值是0時,是決不會成功的:
if ( ( flag & Styles.Flat ) != 0 ) // Never true if Flat == 0.
DoFlatThings( );