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,

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top