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

  • 相关阅读:
    CRUD工程师——嵌入式Web容器
    CRUD工程师——SpringBoot启动原理
    CRUD工程师——日志
    CRUD工程师——慢SQL
    CRUD工程师——索引
    前端专业术语: shim 和 Polyfill,了解下
    H5之postMessage 。实现跨域
    摘抄详细的VUE生命周期
    如何在不使用三大地图的KEY和相关组件的情况下,直接传参数到相关的H5地图
    Mac下通过brew安装指定版本的nodejs
  • 原文地址:https://www.cnblogs.com/shuiguang/p/2610032.html
Copyright © 2020-2023  润新知