【问题标题】:What is the Technical Term for C# inline variable assignment and evaluation?C# 内联变量赋值和求值的技术术语是什么?
【发布时间】:2019-10-01 12:00:47
【问题描述】:

我最近正在阅读 Github 上的一些代码,我遇到了以下行,

if (((tmp = rx.IndexOf("<")) >= 0) && (rx.IndexOf(">") > tmp ))

特别是

      (tmp = rx.IndexOf("<") >= 0) 

并且在 if 语句的下一部分的同一行中立即使用 tmp 变量进行比较

(rx.IndexOf(">") > tmp )

其中一个变量由一个字符串 indexOf() 方法设置,然后“赋值语句本身”正在使用一个大于或等于相等运算符进行评估。

起初我认为这是一个错字,但在通过一个简单的控制台应用程序评估代码时,我发现它是有效的,而且是一个很好的捷径。

问题是“这个的技术术语是什么?”因为我在各种 C# 帮助站点中找不到任何解释。

一个演示如何使用语句的示例控制台应用程序。

public static void Main()
    {
        // first test - the actual code I found in gitHub 
        int tmp;
        int tmp2;
        string rx = "  < test>";

        // the below line is the subject of the question.


        if (((tmp = rx.IndexOf("<")) >= 0) && (rx.IndexOf(">") > tmp )){ 

            Console.WriteLine("The Close brace is after the opening brace!");
        }

        // additional test 
        int r;
        Console.WriteLine(r = 25 + 3);
        Console.WriteLine(r);


        // and another 
        int w = -1;
        Console.WriteLine(" The index of '<' is greater than 0 : " + _
         ((w = rx.IndexOf("<")) > 0).ToString() + _ 
         " and the value of w is " + w.ToString()); 
    }

上述代码的输出如下。 再次,我理解代码的工作原理,我想知道这在技术上叫什么?

The Close brace is after the opening brace!
28
28
The index of '<' is greater than 0 : True and the value of w is 2

【问题讨论】:

  • 我不知道这个术语,但这个功能是从c“继承”的。
  • 没有专门的术语,只是所有花括号语言中的正常语法。赋值也是一个表达式。您只是看不到它经常被使用,因为代码变得非常密集且难以阅读。

标签: c# variable-assignment


【解决方案1】:

没有“技术术语”。 这是一个赋值,赋值可以作为表达式或语句。 这是一个有价值的陈述;或者可以忽略结果值的表达式。 (与 x+y 不同,Result 不允许被忽略) 与前缀和后缀运算符 i++ 相同; 它看起来不像 x = y = z 这样的行中的“内联”;

但是,它并不经常使用,因为它的可读性较差,正如您刚刚证明的那样。 在您的情况下,分配一个值并在同一表达式树中使用该值 高度依赖评估顺序,定义明确,但谁知道呢?

这种写作风格可以保护你的一行代码(通过延长一行) 但它永远不会为您节省任何操作,因此不会导致任何性能。

所以阅读它,理解它,但最好不要经常使用它。

【讨论】:

    【解决方案2】:

    这只是赋值是表达式的结果。它在 C# 规范中定义:

    7.17.1 简单赋值

    = 运算符称为简单赋值运算符。

    简单赋值表达式的结果就是赋值给 左操作数。结果与左操作数具有相同的类型,并且 总是被归类为一个值。

    所以价值

    tmp = rx.IndexOf("<")
    

    是分配给tmp 的值,即rx.IndexOf("&lt;")。然后将该值与外部表达式中的 0 进行比较。

    【讨论】:

    • 只是一个小问题,它实际上是分配给tmp的值,而不是右手表达式的值。这通常没有什么不同,但如果tmp 的类型与表达式的类型不同,则可能是不同的,因为赋值表达式的值与左操作数(变量)的类型相同。一个非常可悲的例子在这里 - dotnetfiddle.net/jjwFYM
    • 只是为了明确一点:x = y = z 仍然是一个简单的赋值。 Not-Simple 是组合作业,例如 a+=3。
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2012-10-14
    • 2015-11-08
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多