gpt4 book ai didi

c# - 如何正确地在 If 语句中进行等价测试?

转载 作者:行者123 更新时间:2023-11-30 13:21:52 25 4
gpt4 key购买 nike

在 C# If 语句中,我通常这样进行等价性测试:

if (isPrime == true)

但是我的 friend 说那是错误的或者浪费资源。他说这是正确的做法:

if (isPrime)

他试图解释,但我不明白为什么条件检查中缺少条件!

我知道我是个菜鸟,但对我来说,这些括号中似乎只有等式的左边。我 friend 说的对吗?为什么?

最佳答案

两者都很好。事实上,它们生成完全相同的 IL:

bool isPrime = true;
if (isPrime == true);

bool isPrime = true;
if (isPrime);

生成

IL_0000:  nop         
IL_0001: ldc.i4.1
IL_0002: stloc.0 // isPrime
IL_0003: ldloc.0 // isPrime
IL_0004: ldc.i4.0
IL_0005: ceq
IL_0007: stloc.1
IL_0008: ldloc.1
IL_0009: brtrue.s IL_000B
IL_000B: ret

如果你有一个 if只有左侧语句(无等号)的语句,编译器将尝试将您的左侧类型隐式转换为 bool ,然后调用左侧的比较运算符和 true .如果你写 isPrime == true 就会发生这种情况同样,因此实际上没有资源被浪费,您运行的代码完全相同。

但是,有一个问题。您没有指定 isPrime 的类型.如果它是一个可为 null 的 bool 值,如 bool? isPrime , 然后

bool? isPrime = true;
if (isPrime);

不会编译。在这种情况下,编译器有义务执行

if (isPrime == true);

这有点浪费,因为它涉及对 Nullable<T>.GetValueOrDefault() 的可能不必要的调用.如果你有 bool?并且您知道它有一个值(也许您之前已经验证过),那么您可以使用:

if (isPrime.Value);

这不需要调用,并且会为您节省一些资源(尽管有编译器优化)。不过,您可能不需要这种性能提升,所以请追求可读性。

如果你好奇的话,我用了 LINQPad在这里生成 IL,我还检查了 the official implementation available for struct Nullable<T> .

关于c# - 如何正确地在 If 语句中进行等价测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35788294/

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