.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作为一个有效的合法选项,就行我们前面的第一个示例一样。

转载于:https://www.cnblogs.com/IPrograming/archive/2013/01/12/EffectiveCSharp_19.html

《Effective C#》读书笔记——条目19:保证0为值类型的有效状态.NET资源管理相关推荐

  1. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  2. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  3. more effective c++和effective c++读书笔记

    转载自http://bellgrade.blog.163.com/blog/static/83155959200863113228254/,方便日后自己查阅, More Effective C++读书 ...

  4. 算法导论读书笔记(19)

    http://www.cnblogs.com/sungoshawk/p/3802553.html 算法导论读书笔记(19) 目录 最优二叉搜索树 步骤1:一棵最优二叉查找树的结构 步骤2:一个递归解 ...

  5. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  6. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  7. Effective C# 原则8:确保0对于值类型数据是有效的(翻译)

    Effective C# 原则8:确保0对于值类型数据是有效的 Ensure That 0 Is a Valid State for Value Types .Net系统默认所有的对象初始化时都为0. ...

  8. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  9. Effective C++ 读书笔记 Item1-Item4

    目录 守则01:把C++看做一个语言的集合,而不是单一的语言 守则02:尽量使用const, enum, inline, 减少宏变量#define的使用 守则03: 尽可能使用const关键字 守则0 ...

最新文章

  1. 两大AI技术集于一身,有道词典笔3从0到1的飞跃
  2. 从前端角度看网页渲染慢的原理及解决方案
  3. 关于ABAP排序不稳定的问题
  4. python 笔记(三) 断言(assert)
  5. Centos7 解决Docker拉取镜像慢的问题
  6. (4)css2.1选择器
  7. 带你了解极具弹性的Spark架构的原理
  8. 补习系列(6)- springboot 整合 shiro 一指禅
  9. 番外篇:根据学习程度划分程序员的级别
  10. Xshell7连接VMware15虚拟机上的Ubuntu详细步骤
  11. 【BIEE】由于排序顺序不兼容,集合操作失败
  12. soft215@163.com,销售工程造价,建筑,工控,模拟分析,财务等商业版软件︻◣
  13. VMware 菜鸟教程
  14. 传统BIOS下的USB启动设置
  15. 5G核心网技术基础自学系列 | 用户面处理
  16. linux syslog原理,Linux日志管理之詳解 syslog/vsyslog
  17. Rxswift学习之(一)函数响应式编程思想
  18. Unity学习笔记(二) 碰撞检测与触发检测
  19. Secret Milking Machine POJ - 2455
  20. 访问网址 token的格式_一文彻底搞懂Cookie、Session、Token到底是什么

热门文章

  1. 游戏服务器的架构演进
  2. 【JavaScript脚本】——T1基本语法——重点笔记
  3. 计算机网络面试题整理
  4. Java扑克牌(洗牌Collections.shuffle)
  5. spring boot配置文件【application.yml】常见问题之一,未添加空格
  6. 娱乐:全方位戒除网瘾 如果你真的想告别WOW
  7. Link Cut Tree学习笔记
  8. 机器学习实战——特征工程之数据预处理
  9. Wi-Fi模块的设置方法汇总
  10. python中的魔法参数:*args和**kwargs