c# – 为什么尝试访问null属性会导致某些语言出现异常?

c# – 为什么尝试访问null属性会导致某些语言出现异常?,第1张

概述对于某些编程语言(例如C#, Javascript)而言,最让我困扰的是,尝试访问null属性导致出现错误或异常. 例如,在以下代码段中, foo = bar.baz; 如果bar为null,C#将抛出一个令人讨厌的NullReferenceException,我的Javascript解释器会抱怨无法获取属性’baz’的值:object为null或undefined. 从理论上讲,我可以理解这一 对于某些编程语言(例如C#,Javascript)而言,最让我困扰的是,尝试访问null属性会导致出现错误或异常.

例如,在以下代码段中,

foo = bar.baz;

如果bar为null,C#将抛出一个令人讨厌的NullReferenceException,我的JavaScript解释器会抱怨无法获取属性’baz’的值:object为null或undefined.

从理论上讲,我可以理解这一点,但在实际代码中,我经常会有一些深层对象,比如

foo.bar.baz.qux

如果foo,bar或baz中的任何一个为空,我的代码就会被破坏. :(此外,如果我在控制台中评估以下表达式,似乎有不一致的结果:

true.toString() //evaluates to "true"false.toString() //evaluates to "false"null.toString() //should evaluate to "null",but interpreter spits in your face instead

我绝对鄙视编写代码来处理这个问题,因为它总是冗长,臭的代码.以下不是人为的例子,我从我的一个项目中抓取了这些(第一个是JavaScript,第二个是C#):

if (!(solvedPuzzles &&       solvedPuzzles[difficulty] &&       solvedPuzzles[difficulty][index])) {      return undefined;   }return solvedPuzzles[difficulty][index].star

if (context != null &&   context.Request != null &&   context.Request.cookies != null &&   context.Request.cookies["SessionID"] != null) {   SessionID = context.Request.cookies["SessionID"].Value;}else{   SessionID = null;}

如果整个表达式返回null,如果任何一个属性为null,那么事情会变得容易得多.上面的代码示例可以简单得多:

return solvedPuzzles[difficulty][index].star;    //Will return null if solvedPuzzles,difficulty,index,or star is null.SessionID = context.Request.cookies["SessionID"].Value;    //SessionID will be null if the context,Request,cookies,//cookies["SessionID"],or Value is null.

有什么我想念的吗?为什么这些语言不会使用此行为?由于某种原因难以实施吗?它会导致我忽略的问题吗?

解决方法

Would it cause problems that I’m overlooking?

是的 – 它会导致您希望存在非空值的问题,但由于存在错误,您将获得空值.在那种情况下,你想要一个例外.静默失败并坚持使用糟糕的数据是一个非常糟糕的主意.

某些语言(例如Groovy)提供了一个可以帮助的空安全解除引用运算符.在C#中它可能看起来像:

SessionID = context?.Request?.cookies?["SessionID"]?.Value;

我相信C#团队过去曾考虑过这个问题并发现它存在问题,但这并不意味着他们将来不会重新考虑它.

总结

以上是内存溢出为你收集整理的c# – 为什么尝试访问null属性会导致某些语言出现异常?全部内容,希望文章能够帮你解决c# – 为什么尝试访问null属性会导致某些语言出现异常?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1245709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存