用静态字段切换语句

Ash*_*osh 8 .net c# static switch-statement

假设我有一堆静态字段,我想在交换机中使用它们:

public static string PID_1 = "12";
public static string PID_2 = "13";
public static string PID_3 = "14";

switch(pid)
{
    case PID_1:
        //Do something 1
        break;
    case PID_2:
        //Do something 2
        break;
    case PID_3:
        //Do something 3
        break;
    default:
        //Do something default
        break;
}
Run Code Online (Sandbox Code Playgroud)

由于C#不允许在开关内部使用非const语句.我想了解这种设计的意图是什么.我应该如何在c#中执行上述操作?

Ser*_*rvy 18

看起来这些字符串值应该只是常量.

public const string PID_1 = "12";
public const string PID_2 = "13";
public const string PID_3 = "14";
Run Code Online (Sandbox Code Playgroud)

如果这不是一个选项(它们实际上是在运行时更改),那么您可以将该解决方案重构为一系列if/else if语句.

至于案例陈述为何必须保持​​不变; 通过使它们保持不变,它可以使语句更加优化.它实际上比一系列if/else if语句更有效(尽管如果你没有很多需要花费很长时间的条件检查,这并不是很明显).它将生成等效的哈希表,并将case语句值作为键.如果值可以改变,则不能使用该方法.

  • @Ashutosh您不能使用只读字段,因为直到运行时才知道该值; `switch`语句将导致在*compile time*生成一个表,这就是case语句都需要编译时常量的原因.`"拥有一个公共静态更有意义""如果值实际上是不变的,我不同意.如果值实际上是常量,则使用`const`值会更有意义.请注意,所有`const`值都是有效的`static`.它们根本不依赖于对象的实例. (2认同)

Mr *_*ood 14

我知道这是一个老问题,但有一种方法没有包含在其他不涉及改变方法的答案中:

switch(pid)
{
   case var _ when pid == PID_1:
      //Do something 1
   break;
}
Run Code Online (Sandbox Code Playgroud)