zoukankan      html  css  js  c++  java
  • 《Effective C#》读书笔记——条目19:保证0为值类型的有效状态<.NET资源管理>

      .NET系统的默认初始化过程会将所有的对象设置为0。我们就会难免创建出一个初始化为0值的值类型,所以我们应该将0作为类型的默认值,可以避免一些不必要的Bug。

    1.将0设置为枚举的有效值

      使用枚举时我们必须将0设置为枚举的一个有效选项。所以枚举值都派生于System.ValueType。枚举默认的值开始于0,但是也可以自定义:

    1     public enum Month
    2     {
    3         //枚举的默认值是从0开始
    4         Jan = 1,
    5         Feb = 2,
    6         Mar = 3,
    7         April = 4,
    8         May = 5,
    9     }

     但是如果实例化一个Month,我们将会得到一个为0的默认值,而这并不是Month的合法值:

    1         Month month = new Month();
    2         Console.WriteLine((int)month);
    3         //输出0

     因此在创建自定义的枚举的时候,必须确保0是一个合法的有效选项,如果可能应该将最适合做默认值的选项表示0,如果没有合适的选项适合做默认值的话,可以把0表示未初始化的值(逻辑上),让类型的使用者知道它当前的状态,例如修改成下面这样:

     1     public enum Month
     2     {
     3         //枚举的默认值是从0开始
     4         None = 0,
     5         Jan = 1,
     6         Feb = 2,
     7         Mar = 3,
     8         April = 4,
     9         May = 5,
    10     }

    2.正确初始化包含引用的值类型

       对于包含引用的值类型(如:字符串),也是比较在初始化的时候出现问题:

    1     public struct LogMessage
    2     {
    3         private int ErrLevel;
    4         private string msg;
    5     }    

    在上面的程序中, 如果实例化一个LogMessage对象,msg字段为一个空引用,且不能直接对其进行初始化(private访问修饰符),不过我们可以通过使用属性类解决这个问题,通过属性将msg字段暴露给外界使用者。然后在属性中添加逻辑:在msg为null是返回一个空字符串:

     1     public struct LogMessage
     2     {
     3         private int ErrLevel;
     4         private string msg;
     5         
     6         public string LogMessage
     7         {
     8             get
     9             {
    10                 return (msg! = null)?msg:string.Empty;
    11             }
    12             set
    13             {
    14                 msg = value;
    15             }
    16         }
    17     }

     这样做的好处就是将null引用的检查限制在一个单一的类型中,假如在程序集内部调用,那么Message属性很可能会被内联。这样既保证了代码的效率,也降低了错误发生的可能。

    小节

      系统的初始化行为让所有的值类型的值都设置为0,这是我们无法避免的,我们能做的就是尽量将0设置为最可能的默认值,反正,也应该将0作为一个有效的合法选项,就行我们前面的第一个示例一样。

  • 相关阅读:
    致敬尤雨溪,Vue.js 让我赚到了第一桶金
    JavaScript 构造树形结构的一种高效算法
    Webpack 4 Tree Shaking 终极优化指南
    腾讯前端面试题:一言不合就写个五子棋
    使用Web代理实现Ajax跨域
    Extjs 4 chart自定义坐标轴刻度
    五分钟了解浏览器的工作原理
    面试官:JavaScript 原始数据类型 Symbol 有什么用?
    JavaScript 初学者容易犯的几个错误,你中招没?
    帮助你更好的理解Spring循环依赖
  • 原文地址:https://www.cnblogs.com/IPrograming/p/EffectiveCSharp_19.html
Copyright © 2011-2022 走看看