Warum gibt es kein RAII in .NET?

In erster Linie ist ein C ++ - Entwickler die Abwesenheit vonRAII (Ressourcenbeschaffung ist Initialisierung) in Java und .NET hat mich immer gestört. Die Tatsache, dass die Aufräumpflicht vom Klassenschreiber auf den Konsumenten verlagert wird (mittelstry finally oder .NETusing konstruieren) scheint deutlich unterlegen zu sein.

Ich verstehe, warum es in Java keine Unterstützung für RAII gibt, da sich alle Objekte auf dem Heap befinden und der Garbage Collector von Natur aus keine deterministische Zerstörung unterstützt, aber in .NET mit der Einführung von Werttypen (struct) Wir haben den (scheinbar) perfekten Kandidaten für RAII. Ein Wertetyp, der auf dem Stapel erstellt wurde, hat einen genau definierten Gültigkeitsbereich, und es kann eine C ++ - Destruktorsemantik verwendet werden. Die CLR erlaubt jedoch keinem Werttyp, einen Destruktor zu haben.

Meine zufälligen Suchen haben ein Argument gefunden, das bei einem Wertetyp gleich istboxed es fällt in die Zuständigkeit des Müllsammlers und daher wird seine Zerstörung nicht deterministisch. Ich bin der Meinung, dass dieses Argument nicht stark genug ist. Die Vorteile von RAII sind groß genug, um zu behaupten, dass ein Werttyp mit einem Destruktor nicht in ein Kästchen eingeschlossen (oder als Klassenmitglied verwendet) werden kann.

Um es kurz zu machen, meine Frage ist: Gibt es andere Gründe, warum Werttypen nicht verwendet werden können, um RAII in .NET einzuführen? (Oder glaubst du, meine Argumentation zu den offensichtlichen Vorteilen von RAII ist fehlerhaft?)

Bearbeiten: Ich muss die Frage nicht klar formuliert haben, da die ersten vier Antworten den Punkt verfehlt haben. ichkennt ÜberFinalize und seine nicht deterministischen Eigenschaften kenne ich aususing konstruieren und ich glaube, diese beiden Optionen sind RAII unterlegen.using ist eine weitere Sache, an die sich der Konsument einer Klasse erinnern muss (wie viele Leute vergessen haben, eine zu setzen)StreamReader in einemusing Block?). Meine Frage ist eine philosophische zur Sprachgestaltung, warum ist sie so und kann sie verbessert werden?

Zum Beispiel mit einem generischen deterministisch zerstörbaren Wertetyp kann ich das machenusing undlock Schlüsselwörter überflüssig (erreichbar durch Bibliotheksklassen):

    public struct Disposer<T> where T : IDisposable
    {
        T val;
        public Disposer(T t) { val = t; }
        public T Value { get { return val; } }
        ~Disposer()  // Currently illegal 
        {
            if (val != default(T))
                val.Dispose();
        }
    }

Ich kann nicht anders, als mit einem Vorschlag zu enden, den ich einmal gesehen habe, dessen Ursprung ich aber derzeit nicht finden kann.

Sie können meine deterministische Zerstörung ertragen, wenn meine kalte tote Hand außer Sichtweite gerät. -Anon

Antworten auf die Frage(6)

Ihre Antwort auf die Frage