在上一文中,论述两个.Net Framework对null应用不够合理的例子。大家评论中,给出了不少指导性意见,这里也对.Net中null的使用规范作一下总结。

1. Empty代表瓶子是空的,null代表瓶子都没有

  首先要明确你的“瓶子”是什么,也就是你代码的逻辑是建立在什么基础或前提之上。如果这个前提不存在,是否为正常的,或是可接受的情况。如果是,则应该允许返回null。

  例如ConfigurationElement,既然允许某个节点属性未定义,自然应该允许null。如果前提因为意外(罕见的情况)未实现,则应该抛出异常,交给上一级堆栈进行处理。相应的,Linq中的FirstOrDefault方法,也是允许“不存在符合条件元素”这个前提被下,返回了null。

2. Null代表未初始化的引用类型成员

  引用类型成员并不一定会在定义或构造函数中就初始化。一种情况,是为了性能考虑,进行延时初始化,如单例模式中。但是,null值不应该传递给外部。

get
{if (instance==null){lock (L){if (instance==null){instance = new Singleton();}}}return instance;
}

  另一种情况,是考虑扩展性,将个别成员留空。如适配器模式中,Asp.Net Page在呈现时,会检查其Adapter属性是否为null,如不是null,则调用Adapter负责呈现。

3. 尽可能减少返回null的场景

  留意了下.Net Framework的函数,返回null的还真是很少见。一返回null,调用函数就不得不进行判断,增加了复杂性,及出错的机率。通过对代码结构进行适当调整优化,应该可以减少null的判断。尤其是框架开发,在公开的API函数中,返回Null的情况应该越少越好。例外的可能是一些按索引取值的属性,如HttpRequest.Form。

  如果是要返回一个集合类型,只要执行无异常,宁可为空也不要返回null。

4. 要对外部数据进行null判断

  在你公开的API中,必须考虑被其他程序集调用,接收到null参数的情况,不管是什么原因传入的。

5. 不要让null参数表示特殊含义

  如果API中,接收null参数表示一个截然不同的场景,传参模块与接收模块间形成了控制耦合。增加了程序理解难度,又容易出错。推荐的做法是,将不同的场景用不同的模块或函数进行分别处理。比如XmlSchema.Add方法,提供一个重载,只接收xsd文件路径,就可以消除这种耦合。

6. 让程序抛出ArgumentNullException而不是NullReferenceException

  空引用异常总是由CLR抛出的,不应该出现在逻辑严密的程序中。而应该在函数开始的参数判断中,就要抛出ArgumentNullException。或者是在函数执行过程中,调用其他函数得到了null,要么对其进行判断予以区别处理,要么抛出新的异常。

  相信如果能遵守这几个规范,一定会减轻许多null带给我们的麻烦和困扰。Null,其实挺好。

转载于:https://www.cnblogs.com/XmNotes/archive/2010/12/20/1911206.html

再议.Net中null的使用规范相关推荐

  1. java中的static类_再议Java中的static关键字

    再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...

  2. 《智源社区周刊:预训练模型》第2期:Facebook用“预微调”改进预训练性能、再议GPT-3中的东方主义偏见...

    超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第2期<智源社区周刊:预训练模型>,从论文推荐.研究动态.热点讨论等几个维度推 ...

  3. 再议C#方法中的反射方式和委托方式

    再议C#方法中的反射方式和委托方式 我们将要谈到的是C#方法中的反射方式和委托方式,文中还将给出具体代码,以方便大家测试和实践. AD: 在开发过程中对静态方法的调用是通过类型名后面加个点而后是调用方 ...

  4. SpringBoot项目中,如何更规范的使用PageHelper分页?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:臣 ...

  5. pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

    SpringBoot项目中,如何更规范的使用PageHelper分页,拉勾IT课小编为大家分解 一. 开发准备 1. 开发工具 • IntelliJ IDEA 2020.2.3 2. 开发环境 • R ...

  6. 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》

    关于数据库中NULL的描述,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. NULL=NULL的返回结果为true. B. NULL与任何值的比较结果都为NULL. C. ...

  7. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

  8. mysql的字段空格是null_MySQL中NULL与空字符串 空格问题

    一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串' '是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而''则表示值是存在的,只不过是个 ...

  9. c语言stdio中null的值,C/C++编程笔记:C语言NULL值和数字 0 值区别及NULL详解

    原创 程序员无言 2020-07-01 在学习C语言的时候,我们常常会碰到C语言NULL值和数字 0 ,很多小伙伴搞不清楚他们之间的一个区别,今天我们就了解一下他们之间的区别,一起来看看吧! 先看下面 ...

最新文章

  1. 2020年python工资一般多少钱-2020年Python发展前景如何呢?
  2. 面向对象进阶-反射(二)重要知识点
  3. 【电脑帮助】解决Win10系统电脑开机速度慢的问题
  4. python 微博评论分析_python抓取新浪微博评论并分析
  5. Ubuntu安装腾达u12驱动
  6. 开源SIP服务器OpenSIPS简介
  7. ts重点学习71-implement语句
  8. 国美易卡借助互联网,国美易卡搭建风控、运营、营销体系
  9. tplink怎么进去_在TP-Link工作体验如何?
  10. 一些PPT演讲前暖场的音乐
  11. 荒岛求生游戏显示服务器不行,荒岛求生连接服务器失败怎么办
  12. Android Fragment嵌套ViewPager,ViewPager嵌套多个Fragment
  13. 企业承担社会责任的必要性
  14. 2019年iOS开发者中心证书生成方法以及极光推送证书使用方法!
  15. 2022年计算机视觉产业链全景图谱,一文读懂计算机视觉产业链全局
  16. 数据库设计思想深究----Mysql(图文)
  17. oracle全文索引之FILTER_2_INSO_FILTER
  18. 是谁把心情写得如此透彻!
  19. 雷达、定位、跟踪等信号处理邻域SCI期刊整理及推荐
  20. 中小企业ERP的安全防御与策略

热门文章

  1. 如何将CSDN文档转换成IPYNB格式的文档?
  2. 从0开始构建Arduino_STM32
  3. 我来说说14届竞赛内容,别拍勿喷
  4. html恢复按钮按下前的状态,如何通过点击按钮暂停和恢复html页面的执行
  5. wxpython输入框_基于wxPython的GUI实现输入对话框(1)
  6. 字典生成_Python数据字典生成工具详解
  7. 什么是电子路径用于连接计算机主板上的芯片,计算机的组成部分及功能346.doc...
  8. java框架三层架构是_MVC框架模式和Javaweb经典三层架构
  9. 极大似然估计_干货|一文理解极大似然估计
  10. irobot擦地机器人故障_懒人必备神器,电动高频擦地,科沃斯地宝T8 AIVI扫地机器人...