Allen Lee在他的一篇博文《從枚舉的初始化說起 [C#]》詳細論述了枚舉的各種初始化方式。有評論認為使用new來初始化枚舉不是一個好的習慣,這也許可以避免很多枚舉的初始化問題,但當枚舉與結構結合時,你能避免枚舉的初始化嗎?
我們知道,c#的結構中,是不允許在聲明一個實例字段的同時初始化它的。這帶來了一個問題,當你聲明一個枚舉類型的實例字段時,你希望該枚舉的第一個成員值是從1開始的,但結構的實例總是把該實例字段初始化為0,這將給你的程序帶來陷阱。
請看示例:
新建一個c#控制台應用程序。
Program.cs文件:
using System; using System.Collections.Generic; using System.Text; namespace StructsAndEnums { class Program { static void DoWork() { date DefaultDate = new date(); //Console.WriteLine()方法自動調用實參DefaultDate的ToString()方法 Console.WriteLine(DefaultDate); date newDate = new date(2012, Month.December, 29); Console.WriteLine(newDate); } static void Main() { try { DoWork(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
Date.cs文件:
using System; namespace StructsAndEnums { enum Month { January = 1, February, March, April, May, June, July, August, September, October, November, December } struct date { private int year; private Month month; private int day; //構造器 public date(int ccyy, Month mm, int dd) { this.year = ccyy - 1900; this.month = mm; this.day = dd - 1; } //重寫ToString方法 public override string ToString() { string data = String.Format("{0}年{1}月{2}日", year + 1900,(int) month, day + 1); return data; } } }
如果你預期的結果為:1900年1月1日
2012年12月29日
那么,你錯了,結果為:1900年0月1日
2012年12月29日