【问题标题】:Double if else without brackets双倍 if else 不带括号
【发布时间】:2015-08-28 09:02:27
【问题描述】:

我最近发现你可以对 if/else 语句使用以下语法:

if (a)
    b = true;
else
    b = false;

当你在其中嵌套另一个 if 子句时,它会变得混乱

if (a)
    if (b)
         c = 3;
else
    c = 1;

但由于编译器会忽略行缩进,因此编译器总是将其解析为(据我了解)

if (a)
    if (b)
         c = 3;
    else
         c = 1;

是否可以不使用括号来实现第二个子句? (我知道这没有什么区别,但在我看来它更干净)


编辑:对于所有 cmet 提出的建议如下:

if (a && b)
    c = 3;
else
    c = 1;

这不一样。如果 a = true 且 b = false,c 将被设置为 1,但预期的值是它根本不会被设置。

【问题讨论】:

  • 完全没用:if (a) if (b) c = 3;别的 ;否则 c = 1;
  • 如果您对无括号、由空格确定的块更满意,您可能想尝试一下 F#。在 C# 中这样做会让很多人非常生气——它使代码难以阅读和推理。不要把你的风格带到一门新的语言中,除非它真的有帮助——在这种情况下,它肯定没有用,它会让任何维护你的代码的人的生活变得非常痛苦。跨度>
  • 不,没有括号是不可能实现的。
  • @Kris 这不一样,如果你这样做,如果 a = true 和 b = false,它会将 c 设置为 1,这不是预期的行为。
  • @L0laapk3 哦,那很好。你已经得到了简短的答案。稍长一点的是:你不能像那样改变一种语言的优先规则。它们是在编译器中构建的,并且可以直接从 CST 构造过程中应用。

标签: c# if-statement


【解决方案1】:

好吧,如果您想将自己的语言引入 C#,为什么不采用风格呢?定义一个If 方法!

public static void If(Func<bool> condition, Action ifTrue, Action ifFalse = null)
{
  if (condition()) ifTrue(); else if (ifFalse != null) ifFalse();
}

然后你可以用

来表示你的代码
var a = false;
var b = true;
var c = 0;

If(() => a, () => If(() => b, () => c = 3), () => c = 1);

砰 - 没有牙套!您甚至不必缩进 :-P 如果有人认为这很难阅读,请不要担心——毕竟,您为什么要容纳其他程序员?如果最坏的情况变得最糟糕,只需从旧的 LISPers[1] 中招募你的 C#ers,没有人会对此嗤之以鼻 ;)

免责声明

不要。

[1] - 无意冒犯 LISP 或 LISPers。

【讨论】:

    【解决方案2】:

    如果你有 多行 条件,你必须放大括号。 C# 不像 Python 那样关心缩进..

    if(condition)
    //enter if statement
    //leave if statement
    

    【讨论】:

      【解决方案3】:
      if (a && b)
           c = 3;
      else if (a && !b)
           c = 1;
      

      这将完全符合您的要求。但是有括号的原因之一是为了避免这样的混淆。添加括号会更容易阅读。

      【讨论】:

        【解决方案4】:

        您可以使用三进制,但如果逻辑很复杂,它可能会变得丑陋/难以阅读。

        c = a ? (b ? 3 : 1) : c;
        

        如果a 为假,c 的值不会改变。

        您可以删除括号,但嵌套的三元组很难阅读,我建议它们是一种反模式。

        【讨论】:

          猜你喜欢
          • 2012-07-02
          • 1970-01-01
          • 2017-06-14
          • 2014-11-11
          • 2015-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多