在switch语句中,有没有办法引用被切换的值?

时间:2015-10-21 06:07:59

标签: c# .net algorithm design-patterns optimization

我有一段像

这样的代码
switch ( eqtn[curidx] )
{ 
    case Calculator.NOT:
        negateNextOp = true; 
        break;
        // CURMODE remains PARSEMODE.OPER
    case Calculator.OR:
    case Calculator.AND:
    case Calculator.XOR:
        lastop = eqtn[curidx++]; // Set last operator equal to the one at curidx; increment curidx
        CURMODE = PARSEMODE.NUM; // Expecting the next portion of the equation to be a number
        break;
    default: 
         throw new Exception(String.Format("At index {0}, encountered character {1} where expected to encounter beginning of operator",
                                       curidx,
                                       eqtn[curidx])
                             ); // Handle unexpected character 
}

并且,正如您所看到的,在switch语句中我引用eqtn[curidx]两次,数字为switch。这似乎可以使它更优雅和最优。我知道,当编译switch语句时,paranthesis中的值是" cached"当代码运行并命中switch语句时。由于该值与eqtn[curidx]相同,因此可能导致在不同的内存地址中具有两个相同的值(对吗?),这将是无用的。

this块内是否有一些等效的switch来引用当前为switch的值?

1 个答案:

答案 0 :(得分:2)

不,没有办法引用“正在打开的内容”,因为编译器不以任何方式为您创建可以访问的变量。

编译器实际是否缓存值取决于您无法控制的内容。

如果您需要缓存副本,这通常是一个好主意,您将不得不自己使用变量:

var op = eqtn[curidx];
switch (op)
{
    ...

这可能有益于以下几个原因:

  1. 它使代码更容易阅读,您不需要解析和查看更大的表达式,以确定它实际上是正在接通的值。
  2. 它使代码更容易纠正,您不会冒险复制/粘贴错误并在以后的N-1位置修复它。
  3. 评估该表达式的行为可能有成本,现在只发生一次。