Почему компилятор 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;
}
Я исследовал IL и даже ASM, и, если я правильно понимаю код, целочисленный переключатель использует таблицы переходов, а строковый переключатель основан на сравнении символов.
Я проверил производительность с помощью BenchmarkDotNet и заметил, что метод String работает быстрее. Кроме того, когда я вручную реализую сравнение в стиле if для целочисленного метода, оно работает значительно лучше. Хотя этот вопрос в первую очередь не связан с производительностью, эти результаты показывают, почему для меня важно понимать различия в том, как компилятор оптимизирует эти случаи.
Мой вопрос: >
Почему компилятор C# выбирает оптимизацию выражения строкового переключателя в цепочку if, но не применяет аналогичную оптимизацию для выражения целочисленного переключателя?
p>
Любое понимание причин, лежащих в основе этих разных компиляторов мы будем очень признательны за оптимизацию операторов переключения!

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

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

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

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

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

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

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