Laden...

Dispose: sollten Referenzen explizit auf null gesetzt werden?

Letzter Beitrag vor 14 Jahren 2 Posts 3.825 Views
Hinweis von gfoidl vor 12 Jahren

Abgeteilt von Dispose implementieren und verwenden (IDisposable)

Hallo zusammen,

das ist ein sehr informativer Thread, aber ich hätte trotzdem noch ein paar Fragen zum Dispose =)

  1. Ist folgende Implementierung richtig? Ist das "this.myClass2 = null;" im Dispose von Class1 nötig? Gehe ich recht in der Annahme, daß wenn ich es nicht auf null setze ja noch eine Referenz existiert und der Speicher der Klasse(n) vom GC nicht freigegeben wird?
public class Class1 : IDisposable
{
    private Class2 myClass2;
    public Class1()
    {
         this.myClass2 = new Class2();
    }
    protected virtual void Dispose(bool disposing)
    {
         if (disposing)
         {
              if (this.myClass2 != null)
              {
                   this.myClass2.Dispose(disposing);
                   this.myClass2 = null;
              }
         }
    }
}

public class Class2 : IDisposable
{
    protected virtual void Dispose(bool disposing)
    {
      ...
    }
}
  1. Wird in einer vom VisualStudio Designer erstellten Form die auf der Form befindlichen Controls automatisch Dispose aufgerufen wenn die Form disposed wird oder muß ich das selbst in der Dispose() der Form machen? (dort wird vom Designer ja nur base.Dispose(); erzeugt).

Viele Grüße
Max

zu 1:
der gc verfolgt alle referenzen. das bedeutet das du nciht manuell referenzen zu anderen objekten auf null setzen musst, damit die objekte dort freigeräumt werden können, wenn dein objekt selbst abgeräumt werden soll (also keine referenz mehr auf dein objekt vorhanden ist)

zu 2:
schau dir den code vom designer an und schau dir im reflector die basismethoden an. in kurz: die controlcollection wird in einer for-schleife disposed.