Оптимизация кода С# IL: условный оператор (? :) и повторное присвоение одной переменной

Я читал С# 7.0 changelog и столкнулся с примером, который показывает новый синтаксис кортежей.

private static (int Max, int Min) Range(IEnumerable<int> numbers)
{
    int min = int.MaxValue;
    int max = int.MinValue;
    foreach(var n in numbers)
    {
        min = (n < min) ? n : min;
        max = (n > max) ? n : max;
    }
    return (max, min);
}

И мне стало любопытно, если компилятор оптимизирует строки, такие как min = (n < min)? n: min; min = (n < min)? n: min; причина min = min кажется немного бесполезной. Я скомпилировал код (в режиме выпуска) и открыл его в ILDASM и увидел, что min = min присваивание все еще существует.

Не сложно ли компилятору пропустить задание? Или, может быть, это связано с проблемой многопоточности?

Ответы

Ответ 1

Способ работы условного оператора состоит в том, что вы всегда получаете назначенное значение, поскольку компилятор всегда ожидает значение после "=". Конечно, компилятор может быть записан для проверки того, является ли левая и правая стороны одинаковыми, переписывая переменную (справа налево) быстрее в большинстве случаев, чем использование проверки для сравнения двух переменных, принимая во внимание, что в в большинстве случаев сценарий min = min маловероятен, и это приведет только к дополнительной проверке и замедлению выполнения 99,9% времени.

Задача программиста - определить, когда использовать условный оператор или простое, если

int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{

    if(n < min) min = n;
    if(n > max) max = n;
}

Таким образом, min min может быть исключено при таких обстоятельствах.