在switch语句中,是否有任何方法可以引用被交换的值

本文关键字:引用 交换 方法 任何 语句 switch 是否 | 更新日期: 2023-09-27 18:18:46

我有一个代码块,像

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 ed。这似乎可以使它更优雅和最优。我知道,当编译switch语句时,括号内的值在代码运行并击中switch语句时被"缓存"。由于该值与eqtn[curidx]相同,因此可能导致在不同的内存地址中有两个相同的值(对吗?),这将是无用的。

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

在switch语句中,是否有任何方法可以引用被交换的值

不,因为编译器不会以任何方式为您创建一个可以访问的变量,因此没有办法引用"正在切换的内容"。

编译器是否真的缓存值取决于您无法控制的事情。

如果你需要一个缓存副本,这通常是个好主意,你必须自己创建一个,使用一个变量:

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

这可能是有益的,原因如下:

  1. 它使代码更容易阅读,你不需要解析和grok一个更大的表达式,看到它实际上是相同的值被打开。
  2. 它使代码更容易得到正确,你不必冒险复制/粘贴错误并在N-1个地方修复它。
  3. 计算表达式的行为可能会产生成本,现在只发生一次。