Оператор переключения в codeDom (стиль таблицы переходов)

Я знаю, что операторы переключения недоступны в CodeDom и как компиляторы работают с оператором переключения.

Поэтому по соображениям производительности, когда присутствует много случаев, я не хочу использовать If-else
Почему оператор switch, а не if-else?

Можно сгенерировать код для имитации таблицы переходов для заданного списка дел.

switch(value) {
    case 0: return Method0();
    case 1: return Method1();
    case 4; return Method4();
}

Произведет:

    private delegate object Method();

    Method[] _jumpTable = new Method[] { Method0, Method1, null, null, Method4 };

    private object GetValue(int value)
    {
        if (value < 0 || value > 4) 
            return null;
        return _jumpTable[value]();
    }

Как лучше всего проанализировать список дел и сгенерировать массив, если в последовательности есть дыры или список разрежен?


person Eric Biron    schedule 05.12.2012    source источник


Ответы (1)


Возможно, вы захотите взглянуть на The Roslyn Project для анализа кода . Если таблица большая и особенно разреженная, тогда может быть лучше if / else (с учетом современных кешей ЦП). Roslyn должен позволить вам пройти по DOM и получить значения case, которые затем можно будет отсортировать (возможно, в одном linq stmt). Я считаю, что вы имеете в виду "перерыв" в переключателе выше. Если вы реализуете что-то подобное, я бы очень внимательно его протестировал, чтобы убедиться, что это действительно улучшает производительность.

person Dweeberly    schedule 19.12.2012