16

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

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;
}

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

4

7 回答 7

32

看起来那些字符串值应该只是恒定的。

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

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

至于为什么 case 语句需要保持不变;通过让它们保持不变,可以对语句进行更多优化。它实际上比一系列 if/else if 语句更有效(尽管如果您没有大量需要很长时间的条件检查,效果并不明显)。它将生成一个等效的哈希表,其中 case 语句的值作为键。如果值可以更改,则无法使用该方法。

于 2012-09-14T18:25:17.953 回答
16

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

switch(pid)
{
   case var _ when pid == PID_1:
      //Do something 1
   break;
}
于 2019-11-20T17:32:20.220 回答
4

... C# 不允许在 switch 中使用非常量语句...

如果你不能使用:

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

您可以使用字典:)

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



// Define other methods and classes here

void Main()
{
   var dict = new Dictionary<string, Action>
   {
    {PID_1, ()=>Console.WriteLine("one")},
    {PID_2, ()=>Console.WriteLine("two")},
    {PID_3, ()=>Console.WriteLine("three")},
   };
   var pid = PID_1;
   dict[pid](); 
}
于 2012-09-14T18:27:56.117 回答
3

case 参数在编译时应该是常量。

尝试const改用:

public const string PID_1 = "12";
public const string PID_2 = "13";
public const string PID_3 = "14";
于 2012-09-14T18:25:26.460 回答
1

我假设您没有将这些变量声明为const. 那说:

switch语句只是一堆if / else if语句的简写。所以如果你能保证, PID_1,PID_2PID_3永远不会相等,上面的等价于:

if (pid == PID_1) {
    // Do something 1
}
else if (pid == PID_2) {
    // Do something 2
}
else if (pid == PID_3) {
    // Do something 3
}
else {
    // Do something default
}
于 2012-09-14T18:28:23.433 回答
1

解决此问题的规范方法(如果您的静态字段实际上不是常量)是使用Dictionary<Something, Action>

static Dictionary<string, Action> switchReplacement = 
    new Dictionary<string, Action>() {
        { PID_1, action1 }, 
        { PID_2, action2 }, 
        { PID_3, action3 }};

// ... Where action1, action2, and action3 are static methods with no arguments

// Later, instead of switch, you simply call
switchReplacement[pid].Invoke();
于 2012-09-14T18:31:31.210 回答
1

为什么你不使用 enum ?
枚举关键字:http:
//msdn.microsoft.com/en-us/library/sbbt4032%28v=vs.80%29.aspx

在您的情况下,它可以通过枚举轻松处理:

public enum MyPidType
{
  PID_1 = 12,
  PID_2 = 14,
  PID_3 = 18     
}
于 2012-09-15T00:10:29.750 回答