Autor Beitrag
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 02.02.06 13:06 
Mir ist klar, dass es bei C# im Prinzip keine Destruktoren mehr gibt. Warum ist mir auch klar.
Nun habe ich aber folgende Situation:
Ich baue eine Verbindung zu einem eMail-Postfach auf und lasse mir ein paar Daten geben. Die Verbindung bleibt zunächst bestehen, da nicht klar ist, ob noch weitere Infos abgefragt werden (einige Anbieter lassen ein schnelles Re-Connect nicht zu).
Wenn das Programm beendet wird, will ich aber sicherstellen, dass die Verbindung wieder getrennt wird. Da ich für die ganze Sache eine eigene Klasse verwende, möchte ich das nicht der Anwendung (sprich: dem späteren Programmierer) überlassen.

Wie gehe ich da am besten ran?
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Do 02.02.06 13:20 
Implementiere entweder IDisposable oder schaue dir CriticalFinalizerObject (.Net 2.0) an.
CriticalFinalizerObject stellt sicher, dass der Finalizer auch beim Programmende ausgeführt wird. (Normalerweise werden alle Finalizer abgebrochen, wenn sich die Zahl der abzuarbeiten Finalizer beim Schließen erhöht statt zu sinken).
IDisposable ist genau dafür da: Aufräumarbeiten nach Verwendung einer Instanz.
Den Finalizer-Weg würde ich nicht empfehlen, Finalizer sind eigentlich nur sinnvoll, wenn absolute Anfänger deine Klassen benutzen sollen. Alle anderen würden aus Faulheit nie solche Leistungsbremsen akzeptieren.
jasocul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 02.02.06 13:44 
Danke. Genau nach sowas, wie IDisposable habe ich gesucht.
Zur Zeit benutze ich noch .NET 1.1. Daher kommt der Finalizer-Weg sowieso nicht in Frage.
Die Nutzung einer Klasse durch einen Anfänger, lässt sich aber auch nicht prüfen. Bleibt also unter Umständen ein gewisses Rest-Risiko.
BoMbY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 19.03.06 19:21 
Ähh, Euch ist aber schon klar, dass es auch in C# Destruktoren gibt, ja?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    class Klasse
    {
        // Konstruktor
        public Klasse()
        {
            
        }

        // Destruktor
        ~Klasse()
        {
            
        }
    }


Diese Destruktoren funktionieren eigentlich ganz gut. Man muss sich nur im Klaren darüber sein, dass diese vom Garbage-Collector aufgerufen werden, und man selbst keinen Einfluss auf den Zeitpunkt des Aufrufs hat.

Gruß,
BoMbY

Moderiert von user profile iconraziel: Code- durch C#-Tags ersetzt
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: So 19.03.06 19:56 
user profile iconBoMbY hat folgendes geschrieben:
Ähh, Euch ist aber schon klar, dass es auch in C# Destruktoren gibt, ja?
Nope, gibt's nicht.
Was du da hast ist ein Finalizer. Die sehen aus wie Destruktoren in C++, sind aber keine. ;)
Finalizer sind eine wichtige Zutat wenn man schneckenlahmen Code generieren will.[1]
Was ich oben zum CriticalFinalizerObject schrieb war eine Lösung um sicherzustellen, dass der Finalizer auch wirklich aufgerufen wird.
Ein sauberes Verwenden von IDisposable ist da definitiv die nettere, weil finalizerfreie und deterministische, Lösung.

[1]Der GC sweep und die eigentliche Collection laufen in einem extra Thread ab.
Deshalb friert deine App auch nicht dann und wann wie in VB/Java kurz ein.
Verwendest du Finalizer müssen die Threads synchronisiert werden das dauert a) um ein Vielfaches länger und b) friert es dir die GUI ein.
Finalizer können eine nette Sache sein. Man muss nur genau wissen wann es wirklich keine bessere Lösung gibt.
Selbst nach mehreren Jahren .Net Dev habe ich nicht einmal Finalizer benutzen müssen. ;)
BoMbY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 21.03.06 19:19 
Ja, Du hast natürlich recht - die Destruktoren (sie heißen laut der C#-Sprachdefinition wirklich so) werden beim Kompilieren in Finalizer umgewandelt. Und auch ich musste noch niemals einen verwenden, und würde sowas wenn möglich über die IDisposable-Methode lösen.

Übrigens ist ja auch eine Kombination beider Methoden möglich - wie sie z.B. im IDisposable Interface Beispiel vom Microsoft vorgeschlagen wird: msdn.microsoft.com/l...osableclasstopic.asp

Gruß,
BoMbY