如何使一个简洁的if语句出错

本文关键字:if 语句 出错 简洁 何使一 | 更新日期: 2023-09-27 18:12:27

如果我有:

logicBeingTested.isItTrue ? (doSomeStuffIfItsTrue) : (doSomeNothingIfFalse);

如果我的论证为真,它只执行语句的真一半而不执行假。我试着这样做:

logicBeingTested.isItTrue ? (status = true) : ();

但这不起作用。我知道我可以通过if语句来解决这个问题但是出于好奇有没有可能在不做任何事情的情况下给出一个答案?

编辑:我的bool值'状态'从OP有点误导,我澄清了我想在新的编辑

如何使一个简洁的if语句出错

我想说最好的阅读也是最好的写作:

status |= logicBeingTested.isItTrue;

只是赋值(即使它是无用的) 可能与条件指令一样快(这可能涉及CMOV,它是如此小的优化,应该被忽略)并且更具可读性(IMO?)。

如果statusNullable<bool>,那么简单地回到一个普通的if(编辑:从评论中似乎不清楚,但它与bool?一起工作,我只是认为if在这种情况下更清楚。Jeroen还指出,如果status是一个属性,它将涉及不同的行为,但我们都有平凡的属性getter,对吗?

if (logicBeingTested.isItTrue)
    status = true;

请注意,status |= logicBeingTested.isItTrueif块相反,如果logicBeingTested.isItTruefalse,那么status是不变的(不是false),那么如果它是null,它仍然是null。如果你正在使用bool?,这是(在我看来)一个使用if的好理由。

关于原始代码的注释:三元操作符?:通常用作函数,而不是因为操作数求值的副作用。在阅读这些代码时,可能会产生相当大的误导。


编辑问题的附录:如果你不只是给一个变量赋值,而是需要执行一个操作,那么什么都没有比旧的if更清楚:

if (logicBeingTested.isItTrue)
    DoSomething();

注意,如果logicBeingTested可能是null,那么您可以将其重写为:

if (logicBeingTested?.isItTrue ?? false)
    DoSomething();

在这种情况下,如果logicBeingTested的行为与logicBeingTested.isItTruefalse一样,则只需使用?? true即可。

可能使用条件运算符:

status = logicBeingTested.isItTrue ? true : status;

但我确实认为,正如其他人评论的那样,这样做会更清晰:

if (logicBeingTested.isItTrue)
{
    status = true;
}