Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C# [C#] Fragen zu automatisch generiertem Code (https://www.delphipraxis.net/26516-%5Bc-%5D-fragen-zu-automatisch-generiertem-code.html)

sharkx 24. Jul 2004 21:29

Re: [C#] Fragen zu automatisch generiertem Code
 
Zitat:

Zitat von Luckie
Das ist aber ein "Kann" kein "Muss", denke ich. Nennt sich dann, glaube ich, [b]inline-Irgendwas[i] oder so.


Absolut Falsch ! Du befindest dich mit Csharp in absoluter OOP, hier befindet sich alles in einer Klasse!


Zitat:

Zitat von Luckie
const String INFO_TEXT = APPNAME + " " + VER+"\nCopyright (c) 2004 Michael Puff\n\nhttp://www.luckie-online.de";

Man fügt keine Strings mit dem + zeichen zusammen, denn es wird dann eine neue Instanz mit diesem String pro + erzuegt, was somit langsam und speicherlastig ist. Der Garbace Collector wird zwar diesen Speicher wieder freigeben, jedoch liegt er zeitweise unnötig auf dem Heap herum.


Zitat:

Zitat von OregonGhost
Es gibt in C# keine Destruktoren. Wenn überhaupt, gibt es nur Finalizer, die mit derselben Syntax geschrieben werden wie in C++ Destruktoren

Falsch! Es gibt in c# Destrukor, das liest man in jedem Anfänger Tutorial im ersten kapitel ;)

Gruß
Torsten

Generalissimo 25. Jul 2004 08:24

Re: [C#] Fragen zu automatisch generiertem Code
 
Zitat:

Zitat von sharkx
Man fügt keine Strings mit dem + zeichen zusammen, denn es wird dann eine neue Instanz mit diesem String pro + erzuegt, was somit langsam und speicherlastig ist. Der Garbace Collector wird zwar diesen Speicher wieder freigeben, jedoch liegt er zeitweise unnötig auf dem Heap herum.

Wenn schon so ne Aussage, dann gib doch auch gleich den Lösungsweg an!
Also man kann es so machen (Strings mit + verbinden) jedoch passiert dann das, was sharkx gesagt hat.
Man sollte die StringBuilder-Klasse dazu verwenden

Zitat:

Zitat von sharkx
Zitat:

Zitat von OregonGhost
Es gibt in C# keine Destruktoren. Wenn überhaupt, gibt es nur Finalizer, die mit derselben Syntax geschrieben werden wie in C++ Destruktoren

Falsch! Es gibt in c# Destrukor, das liest man in jedem Anfänger Tutorial im ersten kapitel ;)

Gruß
Torsten

Stimmt. Nur soll man ihn nicht wirklich bzw. nur in speziellen Fällen einsetzen. Sprich in Situationen wo man genau wissen muss, wann ein Objekt freigegeben wird. Ohne Destruktor macht das der Garbage Collector selbst, jedoch ist dabei der Zeitpunkt der Freigabe unbekannt.

sharkx 25. Jul 2004 08:55

Re: [C#] Fragen zu automatisch generiertem Code
 
Hallo !

Entschuldige Generalissimo, mir wird diesere Fehler nicht mehr unterlaufen ;)


Code:
 StringBuilder sb = new StringBuilder();
sb.Append("Dein Text");

Gruß Torsten

OregonGhost 25. Jul 2004 10:20

Re: [C#] Fragen zu automatisch generiertem Code
 
Nur um das nochmal klarzustellen:
Es gibt in C# keine Destruktoren wie in z.B. C++ oder Delphi. Destruktoren werden für die deterministische Zerstörung von Objekten eingesetzt und sind in .net sowie in C# so NICHT vorhanden.
Das, was man in C# als Destruktoren bezeichnet und was auch aussieht wie ein C++-Destruktor, ist in Wirklichkeit ein Finalizer! Es hat dieselbe Semantik wie die Finalizer der anderen .net Sprachen. Hierbei sollen die Objekte auch zerstört werden, aber der Vorgang ist nicht deterministisch!
Genauer ist ein so genannter Destruktor in C# also nur eine bequeme Methode, die Object.Finalize()-Methode zu überschreiben und dabei implizit (was man sonst von Hand machen müsste) base.Finalize() aufzurufen.
Managed C++ hingegen unterstützt zusätzlich einen deterministischen Destruktor, der aber vom Compiler erzeugt wird und keine CLR-Unterstützung genießt.

Zitat:

Zitat von Microsoft
Hinweis Trotz der scheinbaren Ähnlichkeit haben die Destruktoren in C# und den verwalteten Erweiterungen nicht die gleiche Semantik wie Destruktoren in nicht verwaltetem C++. Verwalteter Code unterstützt keine Semantik für Destruktoren, die der von C++ gleicht.

Es gibt also in C# Destruktoren, aber diese sollten nicht mit Destruktoren aus nicht gemanageten Sprachen verglichen werden. Dispose (wie weiter oben geraten) ist zudem weder Finalizer noch Destruktor.

Zitat:

Zitat von Generalissimo
Stimmt. Nur soll man ihn nicht wirklich bzw. nur in speziellen Fällen einsetzen. Sprich in Situationen wo man genau wissen muss, wann ein Objekt freigegeben wird. Ohne Destruktor macht das der Garbage Collector selbst, jedoch ist dabei der Zeitpunkt der Freigabe unbekannt.

Falsch! In C# gibt es keine deterministische Zerstörung von Objekten. Der Garbage Collector macht es IMMER selbst. Er ruft auch den Finalizer auf, falls die Klasse ihn überschrieben (sprich einen so genannten Destruktor definiert) hat! Man kann den Garbage Collector mit ein paar Tricks beeinflussen oder Objekte am Leben erhalten, aber man kann nicht die Zerstörung von Objekten selbst einleiten. Man kann maximal Ressourcen freigeben, indem man die Dispose-Methode, falls die Klasse IDisposable implementiert, aufruft. Das Objekt wird hierbei nicht zerstört.

Ein wesentlicher Unterschied ist: Bei einem herkömmlichen Destruktor sind alle Referenzen in der Klasse noch gültig, denn Kindobjekte werden erst später freigegeben. Bei einem Finalizer sind die Kindobjekte aber möglicherweise schon zerstört worden, soweit sie gemanaged sind.
Darüberhinaus ist es anders als z.B. in C++, wo jede Klasse einen Destruktor hat (gegebenenfalls vom Compiler generiert), in .net eine aufwändige Sache, einen Finalizer auszuführen und somit generell zu vermeiden.




Edit:
Zitat:

Man fügt keine Strings mit dem + zeichen zusammen, denn es wird dann eine neue Instanz mit diesem String pro + erzuegt, was somit langsam und speicherlastig ist. Der Garbace Collector wird zwar diesen Speicher wieder freigeben, jedoch liegt er zeitweise unnötig auf dem Heap herum.
Das stimmt generell, aber Luckie hat das mit const-Strings gemacht. Ein Blick in ildasm zeigt, dass die Objekte wirklich const sind, es wird also nicht pro + eine Instanz erzeugt, sondern nur pro Konstante - also genau das, was man will. Darüberhinaus ist der Garbage Collector gerade für kurzlebige, also z.B. temporäre Objekte optimiert.

sharkx 25. Jul 2004 18:15

Re: [C#] Fragen zu automatisch generiertem Code
 
Nochmals zum Thema Destruktor:
Microsoft empfiehlt in seinen Dokumenten, eine entsprechende Methode (z.b. mit dem Namen Dispose()) zu erstellen, welche die aufräumarbeiten unabhängig vom Destruktor bei Bedarf durchführt.

Einen Destruktor in C# erstellt man, in dem man eine Methode mit dem Namen der Klasse, aber einem vorangstellten ~ erzeugt. Aufgrund der Automatischen Speicherverwaltung ist aber nicht sicher, wann der Destruktor aufgerufen wird, da der Speichermanager der .NET-Umgebung dies Eigenständig entscheidet.


Gruß
Torsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz