AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# [C#] Fragen zu automatisch generiertem Code
Thema durchsuchen
Ansicht
Themen-Optionen

[C#] Fragen zu automatisch generiertem Code

Ein Thema von Luckie · begonnen am 24. Jul 2004 · letzter Beitrag vom 25. Jul 2004
Antwort Antwort
Seite 3 von 3     123   
sharkx

Registriert seit: 25. Feb 2003
Ort: St. Ingbert
211 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: [C#] Fragen zu automatisch generiertem Code

  Alt 24. Jul 2004, 22:29
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 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 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
Programming today is a race between Software Engineers striving to build bigger and better idiot-proof Programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning!
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#22

Re: [C#] Fragen zu automatisch generiertem Code

  Alt 25. Jul 2004, 09:24
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 von sharkx:
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.
  Mit Zitat antworten Zitat
sharkx

Registriert seit: 25. Feb 2003
Ort: St. Ingbert
211 Beiträge
 
Delphi 7 Enterprise
 
#23

Re: [C#] Fragen zu automatisch generiertem Code

  Alt 25. Jul 2004, 09:55
Hallo !

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


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

Gruß Torsten
Programming today is a race between Software Engineers striving to build bigger and better idiot-proof Programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning!
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#24

Re: [C#] Fragen zu automatisch generiertem Code

  Alt 25. Jul 2004, 11:20
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 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 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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
sharkx

Registriert seit: 25. Feb 2003
Ort: St. Ingbert
211 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: [C#] Fragen zu automatisch generiertem Code

  Alt 25. Jul 2004, 19:15
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
Programming today is a race between Software Engineers striving to build bigger and better idiot-proof Programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.
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