Pet*_*son 7 javascript c# null nullreferenceexception
对于某些编程语言(例如C#,Javascript)而言,最让我困扰的是,尝试访问属性null会导致错误或异常发生.
例如,在以下代码段中,
foo = bar.baz;
Run Code Online (Sandbox Code Playgroud)
如果吧null,C#会引起讨厌NullReferenceException,我的Javascript解释器会抱怨Unable to get value of the property 'baz': object is null or undefined.
从理论上讲,我可以理解这一点,但在实际代码中我常常有一些深层对象,比如
foo.bar.baz.qux
Run Code Online (Sandbox Code Playgroud)
如果,在foo,bar或者baz为null之间,我的代码就会被破坏.:(此外,如果我在控制台中评估以下表达式,似乎有不一致的结果:
true.toString() //evaluates to "true"
false.toString() //evaluates to "false"
null.toString() //should evaluate to "null", but interpreter spits in your face instead
Run Code Online (Sandbox Code Playgroud)
我绝对鄙视编写代码来处理这个问题,因为它总是冗长,臭的代码.以下不是人为的例子,我从我的一个项目中抓取了这些(第一个是Javascript,第二个是C#):
if (!(solvedPuzzles &&
solvedPuzzles[difficulty] &&
solvedPuzzles[difficulty][index])) {
return undefined;
}
return solvedPuzzles[difficulty][index].star
Run Code Online (Sandbox Code Playgroud)
和
if (context != null &&
context.Request != null &&
context.Request.Cookies != null &&
context.Request.Cookies["SessionID"] != null)
{
SessionID = context.Request.Cookies["SessionID"].Value;
}
else
{
SessionID = null;
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?为什么这些语言不会使用此行为?由于某种原因难以实施吗?它会导致我忽视的问题吗?
它会导致我忽视的问题吗?
是的 - 它会导致您希望存在非空值的问题,但由于存在错误,您将获得空值.在那种情况下,你想要一个例外.静默失败并坚持使用糟糕的数据是一个非常糟糕的主意.
某些语言(如Groovy)提供了一个可以帮助的空安全解除引用运算符.在C#中它可能看起来像:
SessionID = context?.Request?.Cookies?["SessionID"]?.Value;
Run Code Online (Sandbox Code Playgroud)
我相信C#团队过去曾考虑过这个问题并发现它有问题,但这并不意味着他们将来不会重新考虑它.
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |