c# пример Оператор switch со статическими полями




switch case c# string (5)

Я предполагаю, что есть причина, по которой вы не объявляли эти переменные как const . Это сказало:

Оператор switch просто сокращает количество операторов if / else if . Поэтому, если вы можете гарантировать, что PID_1 , PID_2 и PID_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
}

Предположим, у меня есть куча статических полей, и я хочу использовать их в коммутаторе:

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 # не разрешает внутриконтактный оператор внутри. Я хочу понять, каково намерение такого дизайна. Как мне сделать что-то вроде выше в c #?


... C # не разрешает внутриконтактный оператор внутри коммутатора ...

Если вы не можете использовать:

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](); 
}

Почему вы не используете перечисление?
Ключевое слово 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     
}

Аргумент аргумента должен быть постоянным во время компиляции.

Попробуйте использовать const вместо:

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

Канонический способ приблизиться к этому - если ваши статические поля не являются фактически константами - это использовать 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();




switch-statement