gpt4 book ai didi

C# 6.0 多个相同的空条件运算符检查与单个传统检查

转载 作者:太空狗 更新时间:2023-10-29 18:31:13 26 4
gpt4 key购买 nike

就主要性能以及易用性或清晰度等方面而言,以下两种等效方法中哪一种最适合 null 条件运算符?

这个:

idString = child?.Id;
fatherName = child?.Father?.Name;
motherName = child?.Mother?.Name;

或者(假设所有局部变量都已经为 null)这个:

if (child != null)
{
idString = child.Id;
fatherName = child.Father?.Name;
motherName = child.Mother?.Name;
}

性能甚至是一个问题吗?

最佳答案

Is performance even an issue?

简短回答:空值检查的性能在普通应用程序中永远不会成为问题。这只是可读性和可维护性的问题。

性能:

是的,您有 3 个“显式” 对照 1 个检查。但您必须记住:

  1. 每次您引用对象实例时,系统都会执行“隐式” 空值检查,如here 所述。 ,并且 afaik JIT 根本没有优化空检查。所以在你的情况下,比率不仅仅是 3 比 1。
  2. 与您在正常软件流程中执行的大多数操作(实例堆分配、数学计算、linq 查询、图形对象呈现、字符串解析、...)。

我只看到极小的性能差异可能性:如果 childMotherFather 不是局部变量或简单的普通属性,但是执行时间很长的方法和属性。例如,GetChild() 方法需要 2 秒才能执行。你能看到一个现实的场景吗?我不能。即使是这种情况,您也可以调用 GetChild() 一次并将其分配给局部变量,然后调用 child? 3 次。

可读性:

一个初始的 if 允许在心理上分离不同的代码块。假装是代码的阅读者,不知道其他任何事情:问问自己是否更简单地阅读 “如果 child 不为 null 执行所有这些操作和填充,否则继续前进”,或 < em>“如果 child 不为空,请检查姓名。如果 child 再次不为空,请检查母亲。如果母亲不为空,请检查母亲的姓名。然后,如果 child 再次不为空,请检查父亲。如果父亲不为空。 .. ... ...“。

可维护性:

又名,在这种情况下,DRY principle .例如,为什么要重复空检查 3 次?假设在未来的某个时刻,您的老板要求您更改代码:不仅需要检查子项的无效性,还需要检查其 Id 是否为 0(类似的事情发生在任何软件开发过程中都非常频繁)。在您的第一个代码部分中,您应该更正 3 行。在您的第二个代码部分中,您应该只更正 1 行:初始 if

编辑:

有关 null 条件运算符的线程安全性的讨论,请参阅 this question .

关于C# 6.0 多个相同的空条件运算符检查与单个传统检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992457/

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