Каков Технический термин для назначения и оценки встроенных переменных в C #? - PullRequest
1 голос
/ 01 октября 2019

Недавно я читал какой-то код на Github и наткнулся на следующую строку:

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

, в частности

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

И немедленное использование переменной tmpв сравнении в той же строке в следующей части оператора if

(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

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Технического термина нет. Это назначение, и назначение может действовать как выражение или утверждение. Это утверждение имеет ценность;Или выражение, в котором значение результата можно игнорировать. (В отличие от x + y, Результат нельзя игнорировать) Он такой же, как префиксный и постфиксный операторы i ++;Он будет менее похож на «inline» в строке, такой как x = y = z;

Однако он используется не часто, потому что он менее читабелен, как вы только что доказали. А в вашем случае присвоение значения и использование значения в одном и том же дереве выражений сильно зависит от порядка вычисления, который хорошо определен, но кто знает его наизусть?

Этот стиль написания спасет вас от строкикода (сделав на одну строку длиннее), но это никогда не спасет вас ни одной операции, следовательно, не приведет к снижению производительности.

Так что читайте, понимайте, но лучше не используйте его часто.

1 голос
/ 01 октября 2019

Это всего лишь следствие того, что присваивание является выражением. Это определено в спецификации C #:

7.17.1 Простое назначение

Оператор = называется оператором простого назначения.

Результатом простого выражения присваивания является значение, присвоенное левому операнду. Результат имеет тот же тип, что и левый операнд, и всегда классифицируется как значение.

Таким образом, значение

tmp = rx.IndexOf("<")

- это значение, присвоенное tmp, котороеrx.IndexOf("<"). Затем это значение сравнивается с 0 во внешнем выражении.

...