当枚举与结构结合时,小心枚举的初始化默认值一定是0
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日