【问题标题】:How to make false of a concise if statement do nothing如何使简洁的 if 语句不做任何事情
【发布时间】:2016-10-11 14:10:58
【问题描述】:

如果我有:

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

我如何做到这一点,所以如果我的论点是正确的,它只会执行该陈述的正确部分而不是错误的。我试过这样做:

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

但这不起作用。我知道我可以通过只做一个 if 语句来解决这个问题,但出于好奇,是否有可能对一个论点给出什么都不做的答案?

编辑:我来自 OP 的布尔值“状态”有点误导,我在新编辑中澄清了我想要的内容

【问题讨论】:

  • 你标记了这个if-statement。您在这里根本不使用if 语句,但您应该使用。
  • 我认为三元运算不适合这种情况 - 普通的 if 语句会更好。
  • 可能是status = status?首先,这是对条件运算符的一种奇怪使用,你对这个操作的结果做些什么吗?听起来这应该是一个普通的if 块。
  • @user1666620 谢谢不知道这被称为三元运算。我认为这和 if 语句是一样的,只是更简洁
  • 对于只能为真或假的布尔值,这绝对没有意义。布尔值有一个标准值,如果不更改则为假。你可以给它赋真或假,这与给它赋真或什么都不做(它保持假)是一样的。

标签: c# if-statement


【解决方案1】:

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

status |= logicBeingTested.isItTrue;

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

如果statusNullable<bool>,那么只需回到简单的if (编辑:从cmets 看来,它似乎并不清楚,但它适用于bool?,我只是认为if 在这方面更清楚案例。Jeroen 还指出,如果 status 是一个属性,它将涉及不同的行为,但我们都有一些微不足道的属性获取器,对吧?)。

if (logicBeingTested.isItTrue)
    status = true;

请注意,status |= logicBeingTested.isItTrue 是 - 与乍看起来相反 - 相当于 if 块,如果 logicBeingTested.isItTruefalsestatus 不变(不是 false)那么如果是null,它仍然是null。如果您正在使用 bool?,这是 (IMO) 使用 if 的一个很好的理由。

关于您的原始代码的注释:ternary operator ?: 通常用作函数,而不是因为其操作数评估的副作用。阅读该代码时可能会产生误导。


已编辑问题的附录:如果您不只是为变量赋值,而是需要执行操作,那么 nothing 比旧的 if 更清楚:

if (logicBeingTested.isItTrue)
    DoSomething();

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

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

在这种情况下,如果 logicBeingTested 你的行为就像 logicBeingTested.isItTruefalse,相反,只需使用 ?? true

【讨论】:

  • “并且可读性更强”——你有权发表你的意见,但它不是普遍的,我怀疑甚至不常见。我会选择if (logicBeingTested.isItTrue) status = true;
  • @hvd 我倾向于同意“如果”是明确的,但简单地分配也强调“状态”是先前值和 logicBeingTested.isItTrue 之间的或(和“如果”隐藏 初读时,IMO)。
  • 这个答案甚至不应该被赞成,恕我直言。 1)为了争论,OP要求避免使用if。 2) 仅提供没有 if 的解决方案不支持 Nullable。 3) 大多数人不会识别按位或赋值运算符'|=';在这里使用它是完全没有必要的,更不用说它不支持 nullables。
  • @daniloquio 1) 这是答案的第一部分(它适用于可空值,您可能想尝试)。我强烈认为答案还应该包括一些关于 OP 所要求的“讨论”……答案的价值在哪里?提供一个糟糕的代码示例,只是为了“从字面上回答问题?) 2)为了迂腐,你可能想考虑一下?:作为如果,我不会建议在这里使用三元运算符... 3) 如果他们不知道 |= 那么他们可能应该回去阅读 MSDN(值得一提的是,对于 bool 操作数,它是 逻辑或,而不是按位或...)
  • @daniloquio 别担心,a |= b 扩展为 a = a || b ,当它涉及可空值时,无法立即理解其含义,如果 bfalse,那么 a 不变- 不是false(这就是我选择if 的原因)。关于讨论:嗯,当我不同意我建议的解决方案时(比如在这种情况下,顺便说一句),我也会尝试解释原因,但好吧,我想这是一个 POV
【解决方案2】:

也许这个使用conditional operator:

status = logicBeingTested.isItTrue ? true : status;

但我确实认为,正如其他人评论的那样,如果为了清晰起见会更好:

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

【讨论】:

  • 大声笑,这很聪明,但如果状态一开始就为空,那么会抛出错误,对吧?
  • 不,在这种情况下,状态将像以前一样保持为空。
  • 我想说第一个是通常的解决方案,它有效,最重要的是,它完全清晰地反映了预期的逻辑。如果这件事是真的,改变“状态”;否则,不要动它。
  • 同意,我自己会选择 if ,但 OP 表示为了争论,排除了 If 解决方案。第一个解决方案应该是接受的解决方案:如果支持可为空,当前接受的答案不支持。
  • @AdrianoRepetti 你说得对,它适用于可空值。我对这个运算符和可空值完全感到困惑。对不起!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2014-06-18
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多