Frage

Zwei Teile dazu:

  1. Wenn eine statische Klasse einen statischen Konstruktor haben kann, warum kann es nicht eine statische destructor hat?

  2. Was ist die beste Abhilfe? Ich habe eine statische Klasse, die einen Pool von Verbindungen verwaltet die COM-Objekte sind, und ich muß sicherstellen, dass ihre Verbindungen geschlossen bekommen / freigegeben, wenn etwas bläst an anderer Stelle im Programm auf.

War es hilfreich?

Lösung

Anstelle einer statischen Klasse, sollten Sie eine normale Klasse mit dem Singleton-Muster verwenden (das heißt, Sie halten eine einzige Instanz der Klasse, vielleicht durch eine statische Eigenschaft auf der Klasse verwiesen selbst). Dann können Sie eine destructor haben, oder noch besser, eine Kombination aus destructor und Entsorgen Methode.

Zum Beispiel, wenn Sie jetzt haben:

static class MyClass
{
    public static void MyMethod() {...}
}

//Using the class:
MyClass.MyMethod();

Sie müßten statt:

class MyClass : IDisposable
{
    public static MyClass()
    {
        Instance=new MyClass();
    }

    public static MyClass Instance {get; private set;}

    public void MyMethod() {...}

    public void Dispose()
    {
        //...
    }

    ~MyClass()
    {
        //Your destructor goes here
    }
}

//Using the class:
MyClass.Instance.MyMethod();

(Beachten Sie, wie die Instanz im statischen Konstruktor erstellt wird, die das erste Mal aufgerufen wird, dass jede der Klasse statischer Elemente verwiesen wird)

Andere Tipps

  1. Statische Klassen haben keine Destruktoren weil eine statische Klasse nie zerstört wird.

  2. Wenn Sie erstellen möchten und mehrere Instanzen zu zerstören, sollte es nicht statisch sein. Machen Sie es eine volle Klasse.

  3. Destructors sollten ohnehin nicht für diesen Zweck verwendet werden. Verwenden Sie IDisposable / Entsorgen.

1. Warum? - Ein Typ kann nicht einen Konstruktor hat per se, wie in, wie Sie denken in der Regel von Konstrukteuren auf Instanzen. Im Allgemeinen ist es manchmal als „statische Initialisierer“ -Verfahren bekannt, aber Microsoft verwendet die Terminologie „Typkonstruktor“ (und es hat eine besondere Einschränkungen) - Sie Code in sie den Typ / Klasse init - wenn es ein Instanzkonstruktors war es sein könnte überladen. Diese statische Einschränkung auf „Typkonstruktor“ ist, weil .NET CLR für das Laden der Klassenvorlage auf dem Heap verantwortlich ist, und erlaubt keine Parameter unter diesen Umständen festgelegt werden (weil, wie würden Sie jemals Argumente übergeben). Denn im strengsten Sinne der Programmierer zu bewirken, dass der Typkonstruktor aufgerufen werden, nicht verantwortlich ist, wäre es nicht viel Sinn, der Programmierer, Code eine statische destructor zu ermöglichen, wenn es in der CLR-Domäne mehr ist. Die CLR entfernt schließlich die Klassenvorlage aus dem Haufen, aber die Lebensdauer der Klassenvorlage ist länger als seine Instanzen, so würde man nichts ressourcenintensiv in ihm trotzdem tun will (zum Beispiel hält eine DB-Verbindung geöffnet).

2. Was? - Singleton Wenn Sie in einen Umstand ausgeführt werden, wo man Sie auf eine Ressource in Klassenvorlage öffnen müssen fühlen und zerstören es danach, dass Sie die System.IDiposable Schnittstelle mit cleanup zu unterstützen, zusätzlich zu dem Destruktor. (Ich sehe jemand hat bereits geschlagen mich auf das IDisposable Codebeispiel zuerst, also werde ich meine Lösung hier beenden.)

Eine statische Klasse wird nie zerstört. Es wird zusammen mit dem Programm beendet. Sie könnten das Singletonmuster als Implemenation verwenden, anstatt eine statische Klasse mit

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