5

我知道 switch 语句不可用CodeDom以及编译器如何处理 switch 语句。

所以在很多情况下出于性能原因,我不想使用 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]();
    }

如果序列中有漏洞或列表稀疏,那么分析案例列表并生成数组的最佳方法是什么?

4

1 回答 1

2

您可能想查看The Roslyn Project以进行代码分析。如果表很大并且特别稀疏,那么 if/else 可能会更好(考虑到现代 CPU 缓存)。Roslyn 应该让您遍历 DOM 并获取可以排序的 case 值(可能在单个 linq stmt 中)。我相信你的意思是在上面的开关中有'break;'。如果你实现这样的东西,我会非常仔细地测试它,以确保它确实提高了性能。

于 2012-12-19T21:14:02.643 回答