2014-03-31 10 views
6

Ich habe den folgenden CodeC# Lebensdauer einer Variablen in Versuch schließlich

screenshot

warum hat x in dem schließlich Block den Wert 5 statt „bereits definiert“ ist oder den Standardwert 0 beeing?

+3

Das ist lustig, zeigt der Debugger tatsächlich 1. Sie können nicht _use_ 'x' im finally Block obwohl,' endlich {int x; int y = x; } 'wird nicht kompiliert. –

Antwort

5

Ich vermute, Sie haben einen Haltepunkt in der finally festgelegt und sah x. x hat keinen Wert gemäß der C# -Sprachspezifikation, aber der Debugger hat wahrscheinlich den Speicherort gesucht, den der erste x hatte und Ihnen seinen Wert angezeigt.

In realen Code könnten Sie nicht lesen x in finally.

Der Debugger folgt nicht den Regeln der Sprache.

1

Sie wahrscheinlich verwenden Visual Studio-Debugger, der auf Variablen Namen für Werte zu überwachen, und einige, wie zeigt falschen Wert, in solchen Fällen versagt.

0

Der Umfang der variablen x ist nur try Block begrenzt, ja Debugger zeigt der Wert 5, aber wenn Sie versuchen, x Variable verwenden Sie die mit Problemen konfrontiert werden Sie erwähnt.

Try This:

finally 
{ 
    int x; 
    Console.Write(x); //error use of unassigned local variable 
} 
7

Die Lebensdauer von x ist innerhalb {...} Block, try in Ihrem Fall; da jedoch gibt es keine Null-Initialisierung von lokalen Variablen in .Net die nächste xMüll enthält die x Wert

try 
{ 
    int x = 5; 
} 
finally 
{ 
    // x is re-declared; since x is local it contains trash; 
    // former x was aquired at the stack, so .Net just moves stack pointer 
    // and doesn't remove former x value 
    int x; 
    ... 
} 

http://msdn.microsoft.com/en-us/library/aa691170(v=vs.71).aspx

... Eine lokale Variable Ersteres ist ist nicht automatisch initialisiert und somit hat keinen Standardwert ...

http://msdn.microsoft.com/en-us/library/aa664742(v=vs.71).aspx

... Der Umfang einer lokalen Variablen in einer lokalen Variable Deklaration deklariert ist der Block, in dem die Erklärung ...

+0

Haben Sie eine Referenz von MSDN, die besagt, dass lokale Variablen nicht initialisiert werden? Ich dachte, die 'JIT' verwendet' default() ', aber der Compiler erzwingt die Initialisierung, um schlechten Code zu vermeiden. – ja72

+0

sie haben einen Standardwert http://stackoverflow.com/questions/2929257/value-of-unassigned-non-nullable-variable-c (siehe Skeets Antwort) – fubo

+0

@fubo: ein * Zitat * aus der Antwort: "für Felder, * nicht lokale Variablen - diese können nicht gelesen werden, bis sie zugewiesen wurden * ... Wert von 'int' ist 0 ..." Kursiv ist mein (Dmitry Bychenko). Beachten Sie, dass * lokale Variablen * (im Gegensatz zu * Feldern *) * nicht durch Nullen * initialisiert werden –

0

tritt warum hat x in der finally- den Wert 1 blockieren anstatt "bereits definiert" zu sein oder den Standardwert 0 zu haben?

Was Sie sehen, ist der Debugger verbindet die Symbole. Es hat überhaupt keinen Wert, und wenn Sie es tatsächlich verwenden, erhalten Sie einen nicht zugewiesenen Variablenfehler.

Nun, warum zeigt es nicht wie bereits definiert ist eine andere Frage. Die Antwort ist, dass {} den Deklarationsraum definiert.(In C# werden Variablen auf der Verzweigungsebene definiert, nicht auf der Funktionsebene). Sie sind in zwei verschiedenen Deklarationsräumen und deshalb ist es erlaubt. Die erste x kann nicht in die zweite x definiert werden.

Was Sie haben, ist anders als

void foo() { 
var x = 2; 

if (true){ 
    var x = 3; 
} 

} 

was nicht erlaubt ist.

Verwandte Themen