Почему компилятор C# оптимизирует операторы переключения строк иначе, чем операторы целочисленного переключения, для повC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему компилятор C# оптимизирует операторы переключения строк иначе, чем операторы целочисленного переключения, для пов

Сообщение Anonymous »

У меня есть два метода в C#, которые используют выражения переключателя: один работает с целыми числами, а другой — со строками:

Код: Выделить всё

public int Int(int value)
{
int sum = value switch
{
0 => 0,
1 => 1,
2 => 2,
_ => throw new System.Exception()
};
return sum;
}

public int String(string value)
{
int sum = value switch
{
"0" => 0,
"1" => 1,
"2" => 2,
_ => throw new System.Exception()
};
return sum;
}
При компиляции (режим Release, C# 12) эти методы преобразуются следующим образом:

Код: Выделить всё

// Integer method
public int Int(int value)
{
switch (value)
{
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
default:
throw new Exception();
}
}

// String method
public int String(string value)
{
if (!(value == "0"))
{
if (!(value == "1"))
{
if (value == "2")
{
return 2;
}
throw new Exception();
}
return 1;
}
return 0;
}
Я проверил производительность с помощью BenchmarkDotNet и обнаружил, что метод String работает быстрее. Кроме того, если я вручную реализую сравнение в стиле if для целочисленного метода, оно также будет работать значительно лучше.
Мой вопрос:
Почему компилятор C# решает оптимизировать выражение строкового переключателя в цепочку if, но не применяет аналогичную оптимизацию для выражения целочисленного переключателя?Любое понимание причин различных оптимизаций компилятора для операторов переключения будет очень признателен!

Подробнее здесь: https://stackoverflow.com/questions/793 ... ently-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»