2012-10-16 4 views
5

Dlaczego zawsze muszę przypisać wartość do zmiennej łańcuchowej, zanim faktycznie użyję jej do porównania. Dla ex: Niektóre wejścia - objDlaczego należy przypisać wartość do napisu przed porównaniem, gdy domyślnie jest null

 string temp; 
     if (obj== null) 
     { 
      temp = "OK"; 
     } 
     string final = temp; 

otrzymuję błąd czasu kompilacji - coś takiego - nie mogę użyć obsadzony zmiennej 'temp'. Ale zmienna łańcuchowa ma domyślną wartość "null", której chcę użyć. Dlaczego nie jest to dozwolone?

Odpowiedz

7

gdy domyślną jest null

Domyślnie jest nie zerowy (lub czegokolwiek innego) do zmiennej lokalnej. To po prostu nieprzypisane.

Prawdopodobnie myślisz o polu ciągu (zmienna na poziomie klasy). To byłoby null:

private string temp; 

private void M() 
{ 
    if (obj== null) 
    { 
     temp = "OK"; 
    } 
    string final = temp; // default tnull 
} 

Ale wewnątrz metody, tylko zainicjować z wartością trzeba:

string temp = null; 
+0

Przy okazji, krótka notatka techniczna. Ponieważ C# kompiluje się do IL, a IL poziomu na poziomie jest oparty na stosie, zmienne technicznie nie istnieją, chyba że zostały przypisane. Podczas gdy debugger może ci powiedzieć, że nieprzypisana zmienna równa się "0" lub coś podobnego, w większości przypadków jest to po prostu uprzejmość. Zostanie on utworzony później. – GregRos

+0

@GregRoss - a kiedy jest tworzony, wierzę, że jest to "default (T)", "null" w tym przypadku. Ale nie można tego zaobserwować dla programisty C#. –

+0

Niezupełnie. W IL zmienna nie może być zadeklarowana bez posiadania jawnej wartości, do której można ją przypisać. Aby przypisać zmienną do 'default (T)' (lub 'null'), musisz najpierw pobrać tę wartość za pomocą jawnego polecenia, a dopiero potem przydzielić ją. W praktyce, IL generowane z C# nigdy tego nie robi. Chociaż możesz myśleć, że zadeklarowałeś zmienną, IL zwykle nie deklaruje jej dopóki nie ma określonej wartości do przypisania. – GregRos

2

Następnie assing null jako domyślny dla lokalnej zmiennej:

string temp = null; 

Nadszedł tylko wskazówka kompilatora, że ​​mógłbyś zapomnieć o przypisaniu wartości. Wyraźnie przypisując wartość null mówisz kompilatorowi, że o tym pomyślałeś. .

Język C# specyfikacja V sekcja 4.0 1.6.6.2 „ciało Metoda i zmienne lokalne” stwierdza co następuje:

Ciało metoda może zadeklarować zmienne, które są specyficzne dla wywołania metody. Takie zmienne nazywane są zmiennymi lokalnymi. ... C# wymaga, aby zmienna lokalna była z pewnością przypisana, zanim będzie można uzyskać jej wartość.

Powiązane problemy