使用 ==operator 或 ?,哪一个更快。操作员 [已关闭]

Which one is faster null check using ==operator or ?. operator [closed]

提问人:Abolfazl Pourmohammad 提问时间:4/12/2023 更新时间:4/12/2023 访问量:89

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

8个月前关闭。

社区在 8 个月前审查了是否重新讨论这个问题,并将其关闭:

原始关闭原因未解决

我是一名 C# 开发人员,我正在一点一点地寻找优化

 if (tksPesin.prmBilgi != null && tksPesin.prmBilgi.Any())

if (tksPesin.prmBilgi?.Any() ?? false)

我尝试改进我的代码,我正在寻找微小的优化。

C# 优化 比较

评论

6赞 MakePeaceGreatAgain 4/12/2023
请阅读 ericlippert.com/2012/12/17/performance-rant。简而言之:通过测量,然后我们猜测您的环境,您就可以更快地确定。此外,您不应该追求微观优化,而应该追求实际的商业价值。
0赞 Theodor Zoulias 4/12/2023
我想知道@EricLippert有什么意见,因为他的咆哮被用作关闭本网站问题的武器。

答:

-2赞 Radu Hatos 4/12/2023 #1
if (tksPesin.prmBilgi?.Any() ?? false)

将被编译为:

 if (tksPesin.prmBilgi != null && tksPesin.prmBilgi.Any())

所以没有区别。您可以使用 https://sharplab.io/ 来查看这些内容是如何编译的。

评论

3赞 Marc Gravell 4/12/2023
看,这不是真的;它将被编译成更像的东西 - 这些差异可能很重要var tmp = tksPesin.prmBilgi; if (tmp is not null && tmp.Any())
0赞 MakePeaceGreatAgain 4/12/2023
正如 Marc 所提到的,猫王操作员是短周期的。
3赞 Marc Gravell 4/12/2023 #2

这两件事是不一样的;在两个非常重要的方面:

  1. != null 可能使用也可能不使用自定义运算符; 始终使用与?.is not null
  2. 在第一个版本中,您可以访问两次;我们看不到,所以我们不知道它是否有隐藏的 http 调用等tksPesin.prmBilgitksPesin.prmBilgiThread.Sleep

所以:可能会有差异,使版本更快。?.

但是,如果您真的想知道哪个更快:在您的特定场景中衡量它们。但实际上,我们绝不会期望版本在任何合理情况下会变慢。?.

如果要使第一个版本与该版本相媲美,则可以使用:?.

var tmp = tksPesin.prmBilgi; // important: access .prmBilgi once only
if (tmp is not null && tmp.Any()) // important: avoid custom != operator
{
    // ...
}

但是,与版本相比,这并不能给您带来任何优势。?.