Announcement

Collapse
No announcement yet.

muss ich das Dataset Objekt zerstören?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • muss ich das Dataset Objekt zerstören?

    Wenn ich ein DataSet nutze:

    DataSet ds = new DataSet();
    dataAdapter.Fill(ds);

    (.... mache irgendwas mit dem DataSet)

    DBConnection.Close();


    und muss ich dann immer das Dataset Objekt zerstören?
    so zum Beispiel:
    ds.Dispose();
    ds = null;

    Oder is es im .NET 2.0 Framework (Visual Studio 2005)
    egal ob ich DISPOSE und = NUll anwende?




    Gruß
    Raimund

  • #2
    Hallo,

    egal ob ich DISPOSE und = NUll anwende?
    Mit null wird der Objektverweis entfernt und das Objekt für den Anwendungskontext nicht mehr verfügbar. Im Arbeitsspeicher "liegt" es jedoch noch irgenwo rum bis der Garbage Collector (GC) alle Objekte aus dem Speicher entfernt. Wann jedoch der GC seine Arbeit aufnimmt kann nicht beeinflusst werden, denn dies ist ein Teil der Common Language Runtime (CLR) und diese ist für das zuständig.

    Mit Dispose werden alle Resourcen des Objekt freigegeben, d.h. auch der Platz im Arbeitsspeicher. Dazu wird dem GC auch mitgeteilt dass dieses Objekt bereits entfernt ist, damit dieser nicht versucht das (nicht mehr vorhanden) Objekt zu entfernen.

    Somit ergibt sich die Regel dass bei Objekten die Dispose unterstützen bzw. als Member offenlegen auch Dispose aufgerufen werden soll.
    Um zu Prüfen ob ein Objekt das Dispose-Member hat kann im Intellisense gesucht werden oder in der Klassendefinition (MSDN, Hilfe) geschaut werden ob die IDisposalbe-Schnittstelle implementiert ist.

    Als vereinfachte Syntax kann die using-Anweisung verwendet werden.
    [highlight=c#]
    using (DataSet ds = new DataSet())
    {
    // Code
    }
    [/highlight]
    Somit wird nach Verlassen des Bereichs {} das Objekt automatisch zerstört - auch im Falle eines Fehlers, da der Compiler dieses Konstrukt in eine try-finally-Block umsetzt.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      ja, Danke für die Antwort!

      das habe ich verstanden,
      dann werde ich wohl besser DISPOSE aufrufen,
      wenn es möglich ist

      Gruß
      Rayman

      Comment


      • #4
        DataSet unterstützt Dispose. IDisposable wird zwar nicht als Interface für DataSet angegeben, aber DataSet wird abgeleitet von MarshalByValueComponent : IDisposable. Also ist auch der using-Block möglich.

        Wenn mit dem using-Block gearbeitet wird, erledigen sich also Dispose und Setzen auf null. Andernfalls schlage ich vor, nach Dispose dennoch die Instanz auf null zu setzen, damit man ggf. an anderen Stellen die Existenz mit "if(xxx != null)" selbst prüfen kann.

        Absehen davon habe ich Zweifel, ob es sinnvoll ist, ein DataSet nur für die DbConnection zu benutzen. Nach dem Einlesen der Daten will man sie doch irgendwo und irgendwie verwenden, oder? Also ist natürlich DbConnection.Close wichtig (für die DbConnection ist der using-Block übrigens sehr nützlich!), aber das DataSet will man danach doch meistens weiter benutzen.

        Gruß Jürgen

        PS 1. DataSet usw. gehört zu ADO.NET, also passen solche Fragen in das betreffende Unterforum.

        PS 2. Code-Schnipsel können als solche markiert werden; das liest sich besser. Dazu den betreffenden Button, z.B. '#' benutzen.

        Comment

        Working...
        X