Сравнение строк - PullRequest
       16

Сравнение строк

0 голосов
/ 10 июня 2009

Сценарий

Рассмотрим следующий фрагмент кода.

        string s = "S";
        string s1 = "S";
        string s2 = string.Empty;
        switch (s)
        {
            case "S":
                s1 = "StringComparison";
                break;
            default:
                break;
        }

        switch (s[0])
        {
            case'S':
                s2 = "StringCOmpare2";
                break;
            default:
                break;
        }

первый случай переключения, приводит к сравнению строк в IL.

Но второй случай переключения не приводит к сравнению строк в IL.

Кто-нибудь может это оправдать?

Ответы [ 4 ]

13 голосов
/ 10 июня 2009

Поскольку на втором переключателе вы не проводите сравнение строк, вы выполняете сравнение символов.

3 голосов
/ 10 июня 2009

Самый простой ответ: вы не проводите сравнение строк во втором блоке; вы сравниваете два символа.

Однако вы правы в том, что два кодовых блока функционально эквивалентны. Хороший оптимизирующий компилятор должен уметь определять, что 's' является строкой фиксированной длины, и переписывать ее, чтобы не использовать полное сравнение строк.

2 голосов
/ 10 июня 2009

Вы получаете доступ к строке через индексатор , который возвращает символ и позволяет использовать строку, как если бы она была массивом символов.

То, что вы делаете - это сравнение символов. Использование апострофа для «S» также говорит о том, что вы используете «S» как символ, а не как строку.

2 голосов
/ 10 июня 2009

Ваш второй оператор switch использует не string , а один char . Следовательно, нет сравнения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...