Ich habe einem Kollegen geholfen, seltsames Verhalten in seinem Code zu debuggen. Das folgende Beispiel veranschaulicht das:Warum funktioniert mein Block nicht in C#?
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
Was gibt dieses Beispiel zurück?
Sie würden denken, dass wegen des finally Block, es "def" zurückgibt, aber tatsächlich, gibt es "abc" zurück? Ich bin durch den Code gegangen und habe bestätigt, dass der finally Block tatsächlich aufgerufen wird.
Die wirkliche Antwort ist, dass Sie Code wie diese überhaupt nicht schreiben sollten, aber ich bin immer noch verwirrt über das Verhalten.
Edit: Um den Fluss basierend auf einigen der Antworten zu klären.
Wenn Sie durch den Code gehen, wird das schließlich vor der Rückkehr ausgeführt.
Duplizieren von:What really happens in a try { return x; } finally { x = null; } statement?
Dies ist falsch..Wenn die return-Anweisung in einem try-Block ist, wird der finally-Block, falls einer existiert, ausgeführt, bevor die Steuerung zur aufrufenden Methode zurückkehrt. – TStamper
TStamper - der Rückgabewert wird im Versuch ausgewertet, während die Variable immer noch "abc" ist, dann wird schließlich die Variablenzuweisung ausgeführt und geändert, aber NICHT das, was bereits zwischengespeichert wurde, um zurückgegeben zu werden. – Chuck
wahr, aber die Formulierung ist falsch.von dem, was er sagt, der Code nicht weiter in der Sample-Funktion ausführen – TStamper