Warum entsorgt Objekt keine Ausnahme auslösen, die auf mit es nach zu entsorgen?

Ist es legal aufrufen einer Methode entsorgt Objekt? Wenn ja, warum?

In der folgenden demo-Programm habe ich eine Einweg-Klasse A (die implementiert IDisposable - Schnittstelle).Soweit ich weiß, wenn ich den pass weggeschmissen, um using() konstruieren, dann Dispose() Methode aufgerufen wird, wird automatisch nach der schließenden Klammer:

A a = new A();
using (a)
{
   //...
}//<--------- a.Dispose() gets called here!

//here the object is supposed to be disposed, 
//and shouldn't be used, as far as I understand.

Wenn das richtig ist, dann bitte erklären Sie die Ausgabe dieses Programms:

public class A : IDisposable
{
   int i = 100;
   public void Dispose()
   {
      Console.WriteLine("Dispose() called");
   }
   public void f()
   {
      Console.WriteLine("{0}", i); i  *= 2;
   }
}

public class Test
{
        public static void Main()
        {
                A a = new A();
                Console.WriteLine("Before using()");
                a.f();
                using ( a) 
                {
                    Console.WriteLine("Inside using()");
                    a.f();
                }
                Console.WriteLine("After using()");
                a.f();
        }
}

Ausgang (ideone):

Before using()
100
Inside using()
200
Dispose() called
After using()
400

Wie kann ich call f() auf das veräusserte Objekt a? Ist dies erlaubt? Wenn ja, dann warum? Wenn Nein, warum dann das obige Programm nicht geben exception zur Laufzeit?


Ich weiß, dass das beliebte Konstrukt mit using ist diese:

using (A a = new A())
{
   //working with a
}

Aber ich bin einfach zu Experimentieren, das ist, warum ich schrieb es anders.

Ich sehe fehlt jemand die deterministische Natur der Speicherverwaltung in C++. 🙂
Was du also sagst ist : ich schrieb ein Programm, das nicht implementieren, der Vertrag von Einweg-Objekte, und wenn ich es laufen lasse, es nicht zu implementieren, der Vertrag von Einweg-Objekte. Sie sind verantwortlich für die Umsetzung, die Verhalten. Sie haben es nicht getan. Gehen, tun Sie es.

InformationsquelleAutor Nawaz | 2011-09-17

Schreibe einen Kommentar