Ich habe den folgenden CodeC# Lebensdauer einer Variablen in Versuch schließlich
warum hat x in dem schließlich Block den Wert 5 statt „bereits definiert“ ist oder den Standardwert 0 beeing?
Ich habe den folgenden CodeC# Lebensdauer einer Variablen in Versuch schließlich
warum hat x in dem schließlich Block den Wert 5 statt „bereits definiert“ ist oder den Standardwert 0 beeing?
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.
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.
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
}
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 x
Mü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 ...
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
sie haben einen Standardwert http://stackoverflow.com/questions/2929257/value-of-unassigned-non-nullable-variable-c (siehe Skeets Antwort) – fubo
@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 –
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.
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. –