Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

14.11.2014, 21:50

[.NET] Wieso brauchen wir eigentlich IDisposable?

Ich arbeite gerade mit SharpDX. So ziemlich jedes Objekt, das ich hier habe muss mit IDisposeable aufgeräumt werden. Wieso eigentlich?
Wieso wird das ganze nicht einfach per Destruktor gelöst?

Gruß Julién
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

2

14.11.2014, 22:01

Wenn ein Objekt nicht mehr referenziert wird, kommt der GC an, ruft den Destruktor auf und gibt es frei. Da das aber nicht zu einem von der Anwendung festgelegtem Zeitpunkt passiert, wird der Desktruktur auch nur irgendwann aufgerufen. Bei einigen Objekten wie z.B. eine Netzwerkklasse oder Dateiklasse oder was auch immer hat dieses Verhalten einige Nachteile, darum bieten diese eine Close-Methode an oder erben eben von IDisposeable, damit das ganze einheiltlich aussieht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

14.11.2014, 22:29

Disposable Objekte werden per Destruktor aufgeräumt. Es ist zumindest laut Microsoft-Spezifikation streng empfohlen, dass der Destruktor eines Disposable Objekts auch die Dispose-Methode ruft, sofern das Objekt nicht schon disposed wurde. Allerdings kann der Destruktor eben irgendwann gerufen, wann der Garbage-Collector halt meint, dass es Zeit ist und bis dahin sind die Ressourcen blockiert. Bei solchen Sachen wie DirectX ist so etwas aber nie eine gute Idee, denn meist verwenden diese nicht gerade kleinliche Ressourcen, die man gezielt freigeben können muss. Genau dafür ist IDisposable gedacht. Jede Klasse, die solche Ressourcen verwendet, implementiert die Dispose-Methode, welche im IDisposable Interface festgelegt wurde. Der Ruf dieser Methode sorgt für eine sofortige Freigabe der belegten Ressourcen und nicht erst irgendwann, wenn der Garbage-Collector zuschlägt.
Wie Roflo schon richtig gesagt hat, sind typische andere Kandidaten für solche Sachen Dateien, Streams, Netzwerkverbindungen, Bilddaten und so weiter.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

14.11.2014, 22:40

Es gibt in C# keinen Destruktor. Es gibt nur einen Finalizer, wegen dem Garbage Collector. Der Finalizer sieht auf den ersten Blick vielleicht ähnlich aus, bieter aber wesentlich weniger und ermöglicht kein RAII. Das heißt kurz gesagt einfach, dass man alles was nicht nur aus Managed Speicher besteht, in C# per Hand aufgeräumt werden muss.

Der wesentliche Unterschied den der Garbage Collector ausmacht ist, dass er nur dann Objekte freigibt wenn er "Lust" hat. Die Lebensdauer der Objekte wird dynamisch von Garbage Collector ermittelt und hängt nicht vom Scope ab. Der Garbage Collector hat zum Beispiel dann besondere "Lust", wenn im der Managed Speicher ausgeht. Geöffnete Dateien oder andere überwiegend unmanged Ressourcen(zum Beispiel von DirectX) unterliegen nicht dem GC und werden folglich nicht von ihm freigegeben.

Es ist zwar theoretisch möglich den Finalizer zu nutzen, praktisch wird davon aber abgeraten. Sonstigen Ressourcen werden sonst möglicherweise eine Ewigkeit nicht mehr freigegeben und stehen dem restlichen System nicht zur Verfügung. Zum Beispiel eine Datei kann auf undefinierte Zeit nicht von anderen Prozessen zugegriffen werden, wenn sie nicht geschlossen wird. Oder eben Daten im Grafikspeicher.

EDIT:
Ich stelle gerade fest, dass Microsoft selbst irreführenderweise den Finalizer in C# häufig Destruktor nennt. Ein wirklicher Destruktor ist deshalb aber natürlich trotzdem nicht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (14.11.2014, 22:59)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

15.11.2014, 07:46

Doch, ist er eigentlich schon. Denn er wird aufgerufen, wenn das Objekt zerstört wird. Wann das ist, das ist eine ganz andere Frage.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

15.11.2014, 10:52

Ist sicher grenzwertig.
Um Verwirrungen oder Fragen wie diesen Thread zu vermeiden, sollte meiner Meinung nach eher vom Finalizer gesprochen werden. RAII ist schließlich nicht möglich.
Wikipedia schreibt zum Beispiel...

Zitat von »http://en.wikipedia.org/wiki/Finalizer#Terminology«

The terminology of "finalizer" and "finalization" versus "destructor" and "destruction" varies between authors and is sometimes unclear.

In common usage, a destructor is a method called deterministically on object destruction, and the archetype is C++ destructors; while a finalizer is called non-deterministically by the garbage collector, and the archetype is Java finalize methods.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

15.11.2014, 11:13

Selbst dieser Wiki-Text ist Quark, denn auch der Finalizer wird deterministisch bei der Objekt-Zerstörung gerufen. Nur ist der Zeitpunkt dafür eben ungewiss. Für die eigentliche Frage ist es aber unerheblich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

15.11.2014, 11:59

Die Objektzerstörung selbst ist bereits nicht deterministisch.
Für die Frage ist es erheblich: Es ist nämlich im Kern eigentlich die Antwort zu "wieso das Ganze nicht einfach per Destruktor gelöst wird".

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

15.11.2014, 12:45

Nein. Denn es ist per Destruktor gelöst. Nur ist der Zeitpunkt für die Objekt-Zerstörung nicht bekannt (allerdings sehr wohl deterministisch, wäre ja schlimm, wenn der Algorithmus des GC nicht deterministisch wäre). Der Destruktor/Finalizer wird dennoch deterministisch bei der Objekt-Zerstörung gerufen. Das sind zwei wichtige Unterschiede.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

15.11.2014, 12:59

Interessant, ich hake mal nach wenn es denn recht ist. Ich bin ebenfalls der Meinung, dass die Zerstörung eines Objektes, wie Spieleprogrammierer schon sagt, nicht deterministisch ist, da es ja eben von einem GC gehandhabt wird. Der GC gibt ja nur irgendwann den Speicher frei.
Wie auch Wikipedia schon sagt (http://de.wikipedia.org/wiki/Garbage_Collection):

Zitat

Nachteilig sind ein gewisser zusätzlicher Verwaltungsoverhead und häufig ein nicht-deterministisches Verhalten der Ausführungsumgebung und damit unter Umständen auch des Programms selbst

Missverstehe ich jetzt, auf welchen Begriff du Determinismus anwendest, BlueCobold? Ist pures Interesse, bevor hier wer ungemütlich wird. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige