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
Zitat von »"Abcd1234"«
Der Autor des Buches erzeugt ständig Klasseninstanzen auf dem Heap ohne den Speicher wieder freizugeben. Ist dies in C# echt kein Problem?
Auf einer Seite stand zwar, dass Speicher automatisch wieder freigeben wird aber woher, weiß das Programm, wann welcher Speicher wieder freigegben werden soll?
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 |
GC.SuppressFinalize(this);
|
Zitat
Frage: Was ist das using-Statement?
Betroffene Sprachen: C#
In vielen C#-Programmen findet man ein sog. using-Statement. Ein gutes Beispiel findet sich in einem typischen XNA-Projekt in der "Program.cs":
Quellcode
1 2 3 4 5 6 7 static void Main (string[] args) { using (Game1 game = new Game1 ()) { game.Run (); } }
Dieses Statement ist die einzigste Möglichkeit um in C# das sog. RAII-Prinzip (Resource Acquisition Is Initialization) abzubilden, welches in C++ oft mit std::auto_ptr realisiert wird bzw. mit boost-Container.
Hin und Her, dieses Statement ist eine Kurzschreibweise für folgendes Statement:
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 static void Main (string[] args) { { MeineKlasse meineInstanz = new MeineKlasse (); try { meineInstanz.MachWas (); } finally { if (meineInstanz != null) meineInstanz.Dispose (); } } }
Wie man hier sehr gut sehen kann, hat dieses Statement bereits beim erstellen einen eigenen Scope und am Ende einer erfolgreichen durchführung ein Dispose des erstellten Objekts durchgeführt wird.
Die Dispose-Methode findet man nur in Objekten die von dem Interface IDisposeable abgeleitet sind. Es empfiehlt sich, da man das RAII-Prinzip so oft wie nur möglich einhalten sollte, ein using-Statement immer zu benutzen, wenn eine Klasse IDisposeable anbietet und ein Objekt nur innerhalb eines Objektes benutzt wird.
Das using-Statement kann man übrigends auch schachteln, damit sie sich den selben Scope teilen:
Quellcode
1 2 3 4 5 6 7 8 9 static void Main (string[] args) { using (Game1 game_one = new Game1 ()) using (Game2 game_two = new Game2 ()) { game_one.Run (); game_two.Run (); } }
Weiterführende Links
Microsoft Developer Network: using Statement (C# Reference)
Microsoft Developer Network: IDisposable Interface (System)
Microsoft Developer Network: IDisposable.Dispose Method (System)
Wikipedia: Resource Acquisition Is Initialization
Zitat von »"unsigned long"«
FALSCH! Wie in Java ist auch der GC in .NET misserabel implementiert (zwar nicht ganz so schlimm, aber dennoch misserabel), aber es geht nicht anders - wenn man sich mal genauer damit beschäftigt, fällt einem auch auf warum.
Zitat von »"unsigned long"«
Jedoch die vereinfachte Aussage: "C#/Java entfernen das Objekt wenn es keine Referenz mehr hat" ist schlichtweg falsch.
Anonymous
unregistriert
Zitat
RAII-Prinzip (Resource Acquisition Is Initialization) abzubilden, welches in C++ oft mit std::auto_ptr realisiert wird bzw. mit boost-Container.
Anonymous
unregistriert
Werbeanzeige