HTML5技术

你写的return null正确吗? - richiezhang

字号+ 作者:H5之家 来源:博客园 2015-11-28 16:13 我要评论( )

上次一篇“你写的try…catch真的有必要吗”引起了很多朋友的讨论。本次我在code review又发现了一个问题,那就是有人有意无意的写出了return null这样的代码,例如: public User GetUser(Guid userId){if ( /*for some reason*/)return null;return DB.GetB

上次一篇“你写的try…catch真的有必要吗”引起了很多朋友的讨论。本次我在code review又发现了一个问题,那就是有人有意无意的写出了return null这样的代码,例如:

public User GetUser(Guid userId) { if ( /*for some reason*/) return null; return DB.GetByUserId(userId); }

这样的写法有木有问题?

在我看来没有充分的理由不应该返回null,因为方法的使用者并不知道在何种条件下会得到null,从而导致臭名昭著的NullReferenceException异常。

如果无法得到一个User,我们应该抛出一个明确的异常供上层服务决定如何处理:

public User GetUser(string userName, string password) { if ( /*for some reason*/) return new SpecificException("can't get this user because ...."); return DB.GetByUserId(userId); }

在我读过的开源项目中我几乎没有见到过return null的写法。能让我一时想到的两个linq方法FirstOrDefault()和LastOrDefault()也是通过方法命名的方式提醒着使用者该方法会返回null。

说到FirstOrDefault()方法让我想起了很多人容易犯的另一个错误:

public User GetUserById(Guid userId) { return list.FirstOrDefault(x=>x.UserId==userId); }

在数据库中该userId只对应一个User的情况下使用了FirstOrDefault()方法,此种场景我会建议你果断使用Single()方法。因为此时使用FirstOrDefault()会隐藏bug。你期望只得到一个User,如果Single()方法抛出异常则说明有bug出现,并且让你在第一时间发现该bug。

F#为了减少null类型的使用引入了option类型,在将option用作函数的返回类型时,使用者如果没有对未定义的类型做处理,编译器会报错。

let invalidInt = None match invalidInt with | Some x -> printfn "the valid value is %A" x | None -> printfn "the value is None"

如果此处的模式匹配忘记编写None->分支,编译器将会报错,从而提醒你必须处理invalidInt值为None时的逻辑。但是在C#中返回null类型,编译器给予不了我们帮助,所以我们应该避免return null这样的代码,你觉得呢?

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • c3和js写的切割轮播图 喜欢宋仲基的妹子汉子们来,观看效果需要引入jQuery^^ - 柿子橙

    c3和js写的切割轮播图 喜欢宋仲基的妹子汉子们来,观看效果需要引入j

    2017-02-26 14:01

  • 自己写的HTML5 Canvas + Javascript五子棋 - 氢氦

    自己写的HTML5 Canvas + Javascript五子棋 - 氢氦

    2016-10-31 13:00

  • Sublime text如何设置快捷键让编写的HTML文件在浏览器预览? - 魔芋铃

    Sublime text如何设置快捷键让编写的HTML文件在浏览器预览? - 魔芋

    2015-11-26 17:20

  • 网页制作经验:用CSS写的网页导航向上箭头_HTML教程

    网页制作经验:用CSS写的网页导航向上箭头_HTML教程

    2015-09-24 17:00

网友点评
=