versuchen schließlich Geheimnis
Frage
Betrachten
static void Main(string[] args)
{
Console.WriteLine(fun());
}
static int fun()
{
int i = 0;
try
{
i = 1;
return i;
}
catch (Exception ex)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
Der Beispielcode "1" aus. aber der Wert von i geändert wird, um schließlich in 3 zu blockieren. Warum war nicht der Wert von ‚i‘ geändert zu 3?
Danke,
Lösung
Betrachten Sie diese Code- Ich denke, der Code wird erklärt, was Sie denken, und wie kann man machen, was man denken soll passieren, passieren tatsächlich:
static void Main(string[] args)
{
int counter = 0;
Console.WriteLine(fun(ref counter)); // Prints 1
Console.WriteLine(counter); // Prints 3
}
static int fun(ref int counter)
{
try
{
counter = 1;
return counter;
}
finally
{
counter = 3;
}
}
Mit diesem Code du 1 von der Methode, aber Sie setzen auch die Zählervariable auf 3, die Sie von außerhalb der Methode zugreifen können.
Andere Tipps
Sie müssen bedenken, dass schließlich nach allem, was sonst in der try und catch ausführt. Legen Sie die return-Anweisung nach der try / catch / finally-Anweisung, um es 3. Rückkehr
Ich stelle mir vor, wenn Sie eine Referenz-Typ anstelle eines Werttyp verwenden Sie ein anderes Verhalten bekommen würde.
Wenn Sie die „Rückkehr i“ ... C # legt diesen Rückgabewert in einem temporären Haltebereich (Speicher) und dann läuft deinen ‚endlich‘ Code ... wenn der finally-Block der Lage ist, diesen Wert zu ändern, es wäre Niederlage der Sicherheit / Finalismus des finally-Block.
Es ist wie eine using-Anweisung mit einer Rückkehr nach innen ... die „Entsorgen“ wird noch passieren wird, nach der Rückkehr (sozusagen).
Schließlich wird immer dann ausgeführt
Ihr Code immer führt schließlich egal, ob eine Ausnahme ausgelöst wurde oder nicht. So Ihr Code eigentlich sein sollte:
try
{
i = 1;
}
catch
{
i = 2;
}
finally
{
i = 3;
}
return i;
Aber in diesem trivialen Fall schließlich Block wird nicht viel Sinn machen. Weil wir immer 3 zurückkehren, egal was vorher passiert ist.
Schließlich wird verwendet, Ressourcen freizugeben
finally
Block normalerweise verwendet werden sollten, wenn Sie einige Systemressourcen innerhalb try
Block zugeordnet lösen müssen (dh. Eine DB-Verbindung eine Lesedaten in try
Block openning und es in finally
Schließung). So werden sie immer, egal frei bekommen, wenn es eine Ausnahme ist oder nicht. In diesem Fall ist es nicht viel Sinn machen finally
Block zu verwenden.