zoukankan      html  css  js  c++  java
  • 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方法中对成员变量赋默认值,以避免出现空指针异常的情况。

  • 相关阅读:
    053592
    053591
    053590
    053589
    053588
    053676
    C# WPF Border控件总结
    Android Studio 添加jar或aar依赖的两种方式
    javascript Date与string之间的转换
    C#:使用dsoframer.ocx控件实现内嵌office效果(详解)
  • 原文地址:https://www.cnblogs.com/wing011203/p/1641813.html
Copyright © 2011-2022 走看看