gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:34:05 26 4
gpt4 key购买 nike

对于某些编程语言(例如 C#、Javascript),真正困扰我的是尝试访问 null 的属性会导致错误或异常发生。

例如,在下面的代码片段中,

foo = bar.baz;

如果 bar 为 null,C# 将抛出一个讨厌的 NullReferenceException 并且我的 Javascript 解释器将提示 Unable to get value of the property 'baz': object为空或未定义

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

foo.bar.baz.qux

如果 foobarbaz 中的任何一个为 null,则我的代码已损坏。 :( 此外,如果我在控制台中评估以下表达式,结果似乎不一致:

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?

是的 - 它会导致您期望存在非空值的问题,但由于错误,您得到了一个空值。在那种情况下,你想要一个异常(exception)。默默地失败并继续使用错误数据是一个非常糟糕的主意。

一些语言(比如 Groovy)提供了一个 null-safe 解引用运算符,这可以提供帮助。在 C# 中,它可能类似于:

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

我相信 C# 团队过去已经考虑过这一点并发现它有问题,但这并不意味着他们将来不会重新访问

关于c# - 为什么尝试访问 null 的属性会导致某些语言出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com