zoukankan      html  css  js  c++  java
  • C# 使用int? 来确保值类型也可以为null

    基元类型需要为null,考虑两个场景:

    1、数据库中一个int字段可以被设置为null。在C#中,值被取出来后,需要先判断一下是否为null,不然把null赋值给int类型会引发异常。

    2、在一个分布式系统中,服务器需要接收并解析来自客户端的数据,一个int类型数据在传输过程中可能会丢失或者被篡改,转型失败后应该保存为null值,而不是提供一个初始值。

    从.net 2.0开始,FCL提供了一个可以为空的类型Nullable<T>,它是结构体:

    [Serializable]
    [TypeDependency("System.Collections.Generic.NullableComparer`1")]
    [TypeDependency("System.Collections.Generic.NullableEqualityComparer`1")]
    public struct Nullable<T> where T : struct

    一个可以为空的int类型声明:

    1 Nullable<int> i1 = null;
    2 int? i2 = null;

    int?是Nullable<int>的简写,两者可以相互转换。

    可以为null的类型表示其在基础值类型的正常范围内的值再加上一个null值。例如,Nullable<int>,其值的范围为-2147483648~2147483647,再加上一个null值。

    基元类型可以直接隐式转换为可空类型:

    1 int? i = null;//可空类型
    2 int j = 0;//基元类型
    3 i = j;

    反过来,可空类型转换成基元类型不能隐式转换,因为可空类型(值范围更大)可能为null值,不能赋值给基元类型,需要判断是否为null:

    1 int? i = null;//可空类型
    2 int j;//基元类型
    3 if (i.HasValue)//判断是否有值
    4 {
    5     j = i.Value;//把值赋值给基元类型
    6 }

    其中第三行到第六行可用??运算符简写:

    1 int? i = null;//可空类型
    2 int j;//基元类型
    3 j = i ?? 0;//如果i有值则将i.Value赋值给j;否则就给j赋值为0.

    参考:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    Aster寻路算法1(转)
    谈谈项目纵向项目验收
    要有兴趣
    用c# 操作 文件的方法
    使用ACT进行测试
    Generated servlet error: keyword cannot be resolved or is not a type
    米尔顿艾瑞克森的催眠引导词
    c# webcliend 来制作 网页搜捕器
    网页木马的解决方案
    用Swing实现数据表格功能
  • 原文地址:https://www.cnblogs.com/xuyouyou/p/13151717.html
Copyright © 2011-2022 走看看