2012-11-15 4 views
14

W przypadku, jeśli piszemy słowo lub pojedynczą literę zamiast default, nie spowoduje to błędu. np.w przypadku przełącznika, jeśli napiszemy "domyślnie" jako słowo lub pojedynczą literę, nie powoduje to błędu.

switch(10) 
{ 
    case 1: 
    break; 

    hello: 
    break; 
} 

Działa bez rzucania błędu.

Czy ktoś może wyjaśnić, jak to działa?

+3

Przypomina mi stary żart/sztuczkę: języki w stylu C rozumieją adresy URL! Możesz wkleić 'http: // www.google.com /' gdziekolwiek w swoim własnym wierszu! = P – Izkata

Odpowiedz

15

Kompiluje się, ponieważ hello: jest etykietą, a zatem może być celem dla goto. Kiedy skompilowany to dostałem ostrzeżenia o przypisań etykiecie (ponieważ nie mają goto)

Oto przykład można rzucać w LINQPad - można zauważyć, że drukuje zarówno „1” i „hello”:

switch(1) 
{ 
    case 1: 
     "1".Dump(); 
     goto hello; 
    break; 

    hello: 
     "hello".Dump(); 
     break; 
} 
12

Nie ma związku z oświadczeniem switch. Jest to identyfikator etykiety (rzadko używany z powodu złej praktyki) goto statement.

goto something2; 
something1: 
    Console.WriteLine("world"); 
    goto done; 
something2: 
    Console.WriteLine("hello"); 
goto something1; 
done: 
5

Dla przykładu można zobaczyć następujący fragment kodu:

switch (10) 
{ 
    case 1: 
     break; 

    hello: 
     Console.Write("In hello label"); 
     break; 
    case 2: 
     goto hello; 
     break; 
} 

w powyższym definiowania etykiety dla goto oświadczeniem w instrukcji switch. Jeśli instrukcja switch spadnie do case 2, wówczas pojawi się etykieta hello. Ponieważ oryginalny fragment kodu nie ma numeru goto hello;, otrzymasz ostrzeżenie o etykiecie, do której nie ma odniesienia.

Twoja etykieta hello nie musi nic robić z instrukcją przełącznika (z wyjątkiem tego, że jest zdefiniowana w środku).