當枚舉與結構結合時,小心枚舉的初始化默認值一定是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日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM