/ / Príkaz switch so statickými poľami - c #, .net, static, switch-statement

Prepnutie príkazu so statickými poľami - c #, .net, statický, prepínač

Predpokladajme, že mám veľa statických polí a chcem ich použiť v prepínači:

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

Pretože C # neumožňuje vo vnútri prepínača príkaz non-const. Chcem pochopiť, čo je zámerom tohto druhu dizajnu. Ako by som mal urobiť niečo podobné ako v c #?

odpovede:

17 pre odpoveď č. 1

Vyzerá to, že tieto hodnoty reťazca by mali byť jednoducho konštantné.

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

Ak to nie je možnosť (v skutočnosti sa za behu menia), môžete dané riešenie preformátovať na sériu príkazov if / else if.

Prečo musia byť výroky prípadukonštantný; ich konštantnosť umožňuje oveľa výraznejšiu optimalizáciu príkazu. Je to v skutočnosti efektívnejšie ako séria príkazov if / else if (aj keď nie dramaticky, ak ich nemáte) kopa podmienených kontrol, ktoré trvajú dlho). Vygeneruje ekvivalent hašovacej tabuľky s hodnotami príkazu case ako kľúčmi. Tento prístup by sa nemohol použiť, ak by sa hodnoty mohli meniť.


3 pre odpoveď č. 2

... C # neumožňuje príkaz non-const vo vnútri prepínača ...

Ak nemôžete použiť:

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

Môžete použiť slovník :)

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

2 pre odpoveď č. 3

Argument case by mal byť v čase kompilácie konštantný.

Pokúste sa použiť const miesto:

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

1 pre odpoveď č. 4

Predpokladám, že existuje dôvod, prečo ste tieto premenné nedeklarovali ako const, To znamená:

Na switch vyhlásenie je len skratka pre kopu if / else if Vyhlásenia. Takže ak môžete záruka že PID_1, PID_2, a PID_3 vôľa nikdy rovnaké, vyššie uvedené je rovnocenné s týmto:

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
}

1 pre odpoveď č. 5

Kanonickým spôsobom, ako k tomu priblížiť - ak vaše statické polia v skutočnosti nie sú konštanty - je použiť a 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();

0 pre odpoveď č. 6

Prečo nepoužívate enum?
Kľúčové slovo Enum:
http://msdn.microsoft.com/en-us/library/sbbt4032%28v=vs.80%29.aspx

Vo vašom prípade to možno ľahko spracovať pomocou enum:

public enum MyPidType
{
PID_1 = 12,
PID_2 = 14,
PID_3 = 18
}