加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在If语句中正确进行等效性测试?

发布时间:2020-12-15 19:26:51 所属栏目:百科 来源:网络整理
导读:在C#If语句中,我通常会进行如下的等效性测试: if (isPrime == true) 但是我的朋友说那是错的,或者浪费了资源.他说这是正确的做法: if (isPrime) 他试图解释,但我不明白为什么条件检查中缺少条件! 我知道我是一个菜鸟,但对我而言,看起来这些方括号中只有左
在C#If语句中,我通常会进行如下的等效性测试:

if (isPrime == true)

但是我的朋友说那是错的,或者浪费了资源.他说这是正确的做法:

if (isPrime)

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

我知道我是一个菜鸟,但对我而言,看起来这些方括号中只有左侧的等式.我的朋友是对的吗?为什么?

解决方法

两者都很好.实际上,它们生成完全相同的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的类型.如果它是一个可空的bool,就像在布尔一样? isPrime,然后

bool? isPrime = true;
if (isPrime);

不会编译.在这种情况下,编译器必须这样做

if (isPrime == true);

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

if (isPrime.Value);

这不需要该调用,并将节省一些资源(尽管编译器优化).您可能不需要这种性能提升,因此请考虑可读性.

如果你很好奇,我在这里用LINQPad来生成ILs,我也检查了the official implementation available for struct Nullable<T>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读