PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Methoden mit ihren Instanzen



dum091n
29.10.2011, 14:50
Ich mache mir Gedanken über folgendes Thema:
Wenn ich in C# eine Methode deklariere, die immer wieder aufgerufen werden soll kann ich das ja Statisch machen oder jedesmal eine neue Instanz erstellen. Wenn ich es Statisch mache bleiben die Werte im Speicher und ich benutze immer die selbe Instanz. Aber was ist wenn ich jedesmal eine neue Instanz aufmache (nicht statisch), wird jedesmal die alte Instanz überschrieben, wenn ich das richtig verstanden habe.
Ich habe irgendwo aufgeschnappt, dass bei der nicht Statischen Lösung, die definierten Instanzen Fehler verursachen können.
Was denkt ihr dazu oder habt ihr sogar ein Beispiel? Wäre hilfreich bei der Verbesserung meines Codes :)
Danke!
MfG dum091n

krusty
29.10.2011, 15:25
Einige Klassen haben allgemeine Funktionen, die man auch ansprechen kann, ohne extra ein Objekt (eine Instanz) zu erzeugen.
Ich kann zwar kein c#, aber in vb ist das ja nicht groß anders.
In vb heißen sie nicht static, sondern shared function.
Ein Beispiel:
dim p as new Process = Process.GetProcessByName("bla")(0)
Die Process Klasse hat eine shared Function, die alle Prozesse mit einem Namen auflistet, bzw ein Array mit Prozessobjekten zurückgibt.
Diese Funktion kann direkt aus der Klasse aufgerufen werden, ohne eine Instanz zu erstellen.

Ich wüsste nicht, warum es fehleranfällig sein sollte ein Objekt zu erstellen und dessen Methoden zu callen o_O.

Wenn deine Klasse nur eine Funktion hat und du diese Funktion sehr oft brauchst, und jedes mal ein neues Objekt erstellst, dann müllst du dir natürlich den speicher zu.

Sawyer
29.10.2011, 17:13
Normalerweise löscht der garbage collector das dynamische Objekt wieder sobald es nicht mehr benötigt wird. Von daher kann eigentlich gar kein Konflikt entstehen.

MfG, Sawyer

dum091n
29.10.2011, 17:40
Das mit dem Garbage Collector dachte ich auch. Ich habe aber irgendwo aufgeschnappt, dass der gar nicht so toll sei und nicht so funktioniere wie von Microsoft versprochen und man deswegen niemals ein dynamisches Objekt für die selbe Funktion ein zweites mal aufrufen soll, weil sonst "Müllberge" entstehen.

Easysurfer
29.10.2011, 18:02
Von MSIL-Code-Seite her gesehn sollten die statischen Funktionen "sparender" sein, vorallem für den GC.

Während bei einer Funktion mit einer Instanz immer erst das Objekt auf den Stack geladen wird bevor CallVirt aufgerufen wird, reicht beim statischen Objekt ein einfaches Call.

Object.Dispose() wird aufgerufen sobald die Instanz nicht mehr gebraucht wird, vorallem bei lokalen Variablen ist das der Fall, also wenn eine Instanz innerhalb einer Scope erzeugt wird. Sobald die Scope wieder verlassen wird, wird das Objekt gelöscht.
Die reine Funktion bleibt allerdings weiterhin im Speicher, in ihrer geJITTeten Form (in ASM-Code quasi). Also ist es egal ob Du die Funktion aus einer neuen Instanz oder statisch aufrufst, sie ist schon vorcompiled im Speicher und bleibt das auch. Also nix mit zumüllen etc ;-)

Greez

dum091n
30.10.2011, 20:24
Danke du hast ein tiefliegendes, psychisches Problem gelöst das mich seit Ewigkeiten beschäftigt :) Ist wichtig zu wissen denke ich, da Funktionen grundlegend sind.
P.S.: Netter Blog :)

---------- Post added at 21:24 ---------- Previous post was at 21:23 ----------

Danke du hast ein tiefliegendes, psychisches Problem gelöst das mich seit Ewigkeiten beschäftigt :) Ist wichtig zu wissen denke ich, da Funktionen grundlegend sind.
P.S.: Netter Blog :)