【问题标题】:var1 = var2 = true; Advantages/Disadvantages?var1 = var2 = 真;优点缺点?
【发布时间】:2009-10-21 08:53:21
【问题描述】:

在语句中使用多重赋值有什么优点或缺点?在简单的例子中

var1 = var2 = true;

分配是从右到左的(我相信 C# 中的所有分配也是如此,可能还有 Java,尽管我没有检查过后者)。但是以这种方式编码是否有任何影响(编译、执行或其他)?

干杯。

【问题讨论】:

    标签: c#


    【解决方案1】:

    这是可读性失败。
    真的不用多说什么了

    var1 = true;
    var2 = true;
    

    var2 = true;
    var1 = var2;
    

    【讨论】:

    • 有费用。其中1行屏幕宝贵的屏幕空间。
    • @Anders:在我看来,难以阅读的代码的认知成本大于丢失屏幕空间的成本。我宁愿看到N 行可理解的代码,也不愿看到N+1 让我想太多的代码行!
    • 有件事告诉我安德斯在开玩笑;)
    • 我会说 var1 = var2 = var3 = Some.Namespace.Garbunkle.EGarbunkleMode.DefaultGarbunkleMode 没问题,有时它还可以,但根据经验 - 是的,为什么要打扰?
    • peterchen,既然如此,为什么不这样做:var1 = Some.Namespace.Garbunkle.EGarbunkleMode.DefaultGarbunkleMode 然后var2 = var1;var3 = var1;
    【解决方案2】:

    我想我是唯一一个喜欢这种方式的人......也许不是两个变量,但如果你有 5 个变量,而你只是在初始化它们,为什么不呢?更容易一次更改它们。这些关于var1=true; var2=var1; 的建议需要更多思考才能理解。要弄清楚var2 实际初始化为什么,您必须查看var1,然后查看分配给它的内容。我认为将它们全部放在一条线上很清楚。

    如果除了初始化它们(执行一些有意义的逻辑)之外,您正在做任何事情,那么最好非常明确地说明您正在做什么(将它们放在不同的行上)。

    【讨论】:

    • 非常同意,我会分开两个变量,但为了节省屏幕空间,我会拼命组合。老实说,如果您无法理解像这样简单的事情,那么您首先在编写基于 C 的语言是什么? (我想三元运算符会完全让你失望:-))
    【解决方案3】:

    没有任何编译或执行影响,但我个人不会这样做。

    使用两个单独的赋值语句更具可读性/可维护性,并且将编译为与单个语句完全相同的 IL。

    bool var1 = true;
    bool var2 = true;
    
    // versus
    
    bool var2;
    bool var1 = var2 = true;
    
    // or
    
    bool var1 = true, var2 = true;
    

    【讨论】:

    • 我更喜欢传统的方式,上层的方式。 var1=var2=true 对我来说没有意义。大声笑
    • bool var1 = var2 = true; 不会自行编译。你需要定义var2
    • @Luke 我也喜欢单独的陈述。对后续开发人员进行调试更友好 - 虽然不是我的代码,Gold Awrd Winning Code,从来没有!哈哈
    • @Kobi:很好,我已经更新了示例。使用单行版本的理由就更少了。
    • 只要做一个 var var1, var2 = true;
    【解决方案4】:

    如果你把它写成这样更容易被人类解析:

    bool var1 = true;
    bool var2 = true;
    

    但在我看来更重要的是,这对于需要比较运算符而不是赋值运算符的错误是模棱两可的。最好明确一点。以下 2 个块对 var1 的值有相反的结果:

    bool var2;
    bool var1 = var2 = false;
    

    bool var2;
    bool var1 = var2 == false;
    

    【讨论】:

      【解决方案5】:

      我最近在代码高尔夫中使用了链接分配的功能,其目标是尽可能少地使用字符。

      在此之前,我认为我从未在 C# 中使用过它,因为它使代码的可读性降低。要理解该语句,您必须从右到左阅读它,而这不是您自然阅读代码的方式。

      正如 Anders Rune Jensen 所提到的,您可能想要强调变量中的值应该是相同的,但是您也可以在两个语句中做到这一点以使其更清晰:

      var1 = true;
      var2 = var1;
      

      如果实际生成的代码完全不同,则性能差异根本没有或在正常情况下太小而无法衡量。

      【讨论】:

        【解决方案6】:

        我每次都会追求可读性,但最易读的恰恰是见仁见智,取决于上下文。对于引用的两个变量,我会使用单独的行,如

        var1 = true;
        var2 = true;

        但另一方面,对于更多变量,我通常会使用更长的赋值来节省屏幕空间。例如编码图形,使用简单的 x、y、s 和 t 变量来表示坐标是很常见的。在这种情况下,我会毫不犹豫地选择

        x = y = s = t = 0;

        因为丢失 3 行屏幕空间会影响可读性。坦率地说,虽然如果你不能理解上述结构,那么简单是首选,你首先要编写一个基于 C 的语法,因为另一个节省空间的好方法,三元结构,会完全打败你。

        a = (x==y) ?值1:值2;

        【讨论】:

          【解决方案7】:

          以类似的方式,考虑:

          var var1, var2;
          var1 = var2 = new int[3];
          var1 = {1, 1, 1};
          var2 = {2, 2, 2};
          

          var1 和 var2 现在指向同一个引用 {2, 2, 2}。

          当 var1 和 var2 是引用类型(例如数组)时,请记住,即使数组的元素是值类型(例如 int),数组仍然是引用类型。

          【讨论】:

            【解决方案8】:

            它只是将内容放入一行而不是多行。并且还清楚地表明您实际上希望 var1 和 var2 具有相同的值。

            var1 = true;
            var2 = true;
            

            可能看起来像一个 c/p 错误 ;-)

            【讨论】:

              【解决方案9】:

              这个符号对于“代码高尔夫”非常有用:)

              // 34 symbols
              bool var1 = true;
              bool var2 = true;
              
              // versus 27 symbols
              bool var2;
              bool var1=var2=1;
              
              // vs 22 symbols
              bool var1,var2=var1=1;
              

              【讨论】:

                【解决方案10】:

                一组有趣的回复,谢谢。我想我会总结一下(这是否允许?)

                我认为在声明简单变量的初始值时使用多重赋值也许是可以接受的,尽管不是许多人的偏好。但大多数人都同意可读性更为重要。他们的偏好是单独的陈述。我的也是。

                我刚才对此做了进一步的谷歌,发现有人在.Net 1.1中测试了"Performance and Multiple Assigment in C#"。似乎有一个非常小的打击。看看吧。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-14
                  • 2011-04-02
                  • 2015-06-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-07-13
                  • 1970-01-01
                  • 2018-01-09
                  相关资源
                  最近更新 更多