Marcel: Objekt zerstören in C#

Hallo zusammen

Ich habe eine Klasse, welche Inhalte einer Datenbank, bzw. einer Tabelle abbildet:

class

  1. Oje, zu früh abgeschickt. Nochmals: Ich habe eine Klasse welche einen Datensatz in einer Datenbank abbildet in C# geschrieben:

    class Datensatz {

    Daten daten;

    struct Daten {
      int id;
      string feld1;
    }

    public Datensatz(string feld1) {
       this.daten = new Daten();
       this.daten.feld1 = feld1;
       this.daten.id    = DatenbankKlasse.SchreibeInDatenbank(this.daten);
    }

    public Datensatz(int id) {
       this.daten = DatenbankKlasse.LeseVonDatenbank(id);
    }

    public DatensatzLöschen() {
       DatenbankKlasse.LöscheAusDatenbank(this.daten)
       # Hier muss nun das Objekt zerstört werden. Wie?
    }
    }

    Wenn man nun die Methode DatensatzLöschen() aufruft sollte natürlich auch die aktuelle Instanz gelöscht werden. Kann man das irgendwie realisieren? Wenn ja wie?

    Gruss Marcel

    1. Hallo Marcel,

      Die Objekte werden automatisch verwaltet, d.h. wenn es keine Referenz mehr auf das Objekt gibt, kann es gelöscht werden. Die VM tut das dann irgendwann, wenn ihr danach ist oder speicherplatz benötigt wird.)
      Ich würde nicht drauf wetten, dass es in C# wirklich keine Methode zum Löschen von Objekten gibt (MS wäre das schon zuzutrauen), aber ich vermute stark, dass es so ist.

      Dein Objekt muss entsprechend seines Zustandes reagieren. Wenn der entsprechende Datenbankeintrag gelöscht wurde und jemand benutzt das Objekt trozdem, musst Du halt eine IllegalStateException (gibt es in Java) oder etwas ähnliches werfen.

      Grüße

      Daniel

      1. echo $begrüßung;

        Ich würde nicht drauf wetten, dass es in C# wirklich keine Methode zum Löschen von Objekten gibt (MS wäre das schon zuzutrauen), aber ich vermute stark, dass es so ist.

        Es gibt die Möglichkeit eine Garbage Collection auszulösen und außerdem kann man mit dem using statement (nicht zu verwechseln mit der using Direktive (using System.bla.fasel;)) das Aufräumen nach Gebrauch erledigen lassen.

        echo "$verabschiedung $name";

        1. Hi,

          es gibt auch tatsächlich einen Destruktor in C#, ähnlich dem aus C++. Allerdings wird dieser erst bei der Garbage Collector Aufräumroutine getriggert ...

          class A {

          // constructor
            public A() { ... }

          // destruktor
            public ~A() { ... }

          // other code goes here ;)
          }

          Außerdem kann man ein eigenes Objekt vom Interface IDisposable ableiten und dann die Methode Dispose() implementieren. Der Garbage Collector wird in entsprechendem Falle dann beim Aufräumen der Klasse auch diese Methode aufrufen (wenn das Interface implementiert wird). Das using Statement basiert ebenfalls darauf, es wird beim Verlassen des Gültigkeitsbereiches dann die Dispose Methode des Objektes aufgerufen, "using" mit Objekten die nicht IDisposable implementieren ist meines Wissens nach nicht möglich.

          Die Dispose Methode eignet sich für die Implementierung von klassen-spezifischen Aufräumarbeiten, z.b. "teure" Objekte wie COM+ Instanzen zu beseitigen.

          Ciao, Frank