• Effective C# Item8:确保0是值类型的有效状态


        .NET会将对象的值默认设置为0,对于值类型来说,例如struct,我们无法阻止开发人员将结构体中的成员设置为0,因此,我们需要将0设置为有效状态。

        对于枚举类型来说,如果通过new的方式新建一个枚举类型的对象,那么对象的值是0,代码如下。

    代码
    1 public enum EnumSex
    2 {
    3 Female = 1,
    4 Male = 2
    5 }
    6
    7 private static void TestEnum()
    8 {
    9 EnumSex sex = new EnumSex();
    10 Console.WriteLine(sex.ToString());
    11 }

        上述代码的运行结果是向控制台中输出0,但是EnumSex中并没有对0进行定义,因此,这时,sex对象的状态已经是一个非法状态了。

        很多情况下,为了解决这个问题,我们都是这样来使用枚举

    EnumSex sex = EnumSex.Male;
    1 public struct Employee
    2 {
    3 private string m_strName;
    4
    5 public string Name
    6 {
    7 get { return m_strName; }
    8 set { m_strName = value; }
    9 }
    10 private EnumSex m_sex;
    11
    12 public EnumSex Sex
    13 {
    14 get { return m_sex; }
    15 set { m_sex = value; }
    16 }
    17 }
    18
    19 private static void TestStruct()
    20 {
    21 BirthInfo birthInfo = new BirthInfo();
    22 Console.WriteLine(birthInfo.Birth);
    23 Console.WriteLine(birthInfo.Birth.ToString());
    24 }

        以上面这种方式来做,是可以避免“0”问题,但是我们来查看以下代码。

    代码
    1 public struct Employee
    2 {
    3 private string m_strName;
    4
    5 public string Name
    6 {
    7 get { return m_strName; }
    8 set { m_strName = value; }
    9 }
    10 private EnumSex m_sex;
    11
    12 public EnumSex Sex
    13 {
    14 get { return m_sex; }
    15 set { m_sex = value; }
    16 }
    17 }
    18
    19 private static void TestEmployee()
    20 {
    21 Employee emp= new Employee();
    22 Console.WriteLine(emp.Sex);
    23 }

        上述代码的执行结果是向控制台中输出0,因为当我们通过new的方式新建一个Employee类型的对象时,会初始化Sex,Sex在初始化后的值就是0。

        我们再来看下面的代码。

    1 private static void TestEmployee()
    2 {
    3 Employee emp= new Employee();
    4 Console.WriteLine(emp.Name);
    5 Console.WriteLine(emp.Name.ToString());
    6 }

        上述代码在执行过程中,是会抛出空指针异常的,究其原因,当我们在通过new的方式新建一个Employee类型的对象时,会初始化Name属性,如果程序没有对其进行设置,默认的初始值是空,这时直接调用Name属性是没有问题的,但是调用Name属性的方法(这里是ToString()方法),就会抛出空指针异常。

        因此,我们在程序中,首先应该对“0”的情况进行处理,以保证“0”是一个合法的状态;其次,我们应该考虑如何在默认构造函数或者属性的get方法中对成员变量赋默认值,以避免出现空指针异常的情况。

  • 相关阅读:
    WPF学习10:基于MVVM Light 制作图形编辑工具(1)
    外文翻译 《How we decide》赛场上的四分卫
    算法学习01:二分查询,选择法、插入法、分治法排序
    外文翻译 《How we decide》 Introduction
    WPF学习09:数据绑定之 Binding to List Data
    WPF学习08:MVVM 预备知识之COMMAND
    WPF学习07:MVVM 预备知识之数据绑定
    WPF学习05:2D绘图 使用Transform进行控件变形
    WPF学习06:转换控件内容为可存储图片
    WPF学习04:2D绘图 使用Shape绘基本图形
  • 原文地址:https://www.cnblogs.com/wing011203/p/1641813.html
Copyright © 2020-2023  润新知