关闭

改善C#程序的157个建议(连载5)

发表于:2011-10-18 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议5:使用int?来确保值类型也可以为null

  基元类型为什么需要为null?考虑两个场景:

  1)数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。

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

  类似的场景还有很多,所以从.NET 2.0开始,FCL中提供了一个额外的类型:可以为空的类型Nullable<T>。它是一个结构体,声明如下:

[SerializableAttribute]
public struct Nullable<T> where T : struct

  因为是结构体,所以只有值引用类型才可以作为“可以为空的类型”(引用类型本身就可以为null)。一个可以为空的int类型表示为:

Nullable<int> i = null;

  它也可以表示为:

int? i = null;

  语法T?是Nullable<T>的简写,两者可以相互转换。可以为 null 的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2 147 483 648 ~ 2 147 483 647,再加上一个null值。

  现在来看看可空类型和基元类型的互相转换。基元类型提供了其对应的可空类型的隐式转换,如下所示:

  • int? i = null;  
  • int j = 0;  
  • i = j;
  •   反过来,可空类型不可隐式转换为对应的基元类型,正确的转换形式如下:

  • int? i = 123;  
  • int j ;  
  • if (i.HasValue)  
  • {  
  •     j = i.Value;  
  • }  
  • else  
  • {  
  •     j = 0;  
  • }
  •   但是,这段代码看上去是不是有点烦琐?所以,在阐述可空类型的时候,不得不提到??运算符。??最大的用处就是将可空类型的值赋值给对应的基元类型进行简化,上文代码的一个简化形式就是:

  • int? i = 123;  
  • int j = i ?? 0;
  •   int j = i ?? 0;表示的意思是,如果i的HasValue为true,则将i的value赋值给j;否则,就给j赋值为0。

    相关链接:

    改善C#程序的157个建议(连载1)

    改善C#程序的157个建议(连载2)

    改善C#程序的157个建议(连载3)

    改善C#程序的157个建议(连载4)

    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号