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

posted on 2012-07-26 14:38  水光  阅读(4211)  评论(7编辑  收藏  举报

导航