Statische Methode, die Objektinstanzen enthält, ist das falsch?

8

Ich verwende eine Erweiterungsmethode für die Klasse string . Innerhalb dieser Erweiterungsmethode erstelle ich eine Instanz von StringBuilder.

Hier ist der Code:

%Vor%

Es funktioniert, aber ich habe Bedenken hinsichtlich der Speicherverwaltung. Statische Methoden werden nicht instanziiert. Was passiert also, wenn ich ein Objekt innerhalb der statischen Methode instanziiere? Nehmen wir an, ich würde diese statische Methode 100 Mal aufrufen, wären 100 Kopien der StringBuilder-Instanzen im Speicher?

Würde es Speicherleck verursachen? Stellt Garbage Collector die Objektinstanz bei Beendigung der statischen Methodenausführung zur Verfügung?

    
Bogac 30.10.2014, 14:45
quelle

4 Antworten

10

Es ist absolut nichts falsch mit Ihrem Code.

Das Erstellen von Instanzen innerhalb einer statischen Methode funktioniert genauso wie das Erstellen von Instanzen innerhalb einer Instanzmethode. Jeder Aufruf generiert eine neue Instanz, fällt jedoch am Ende des Methodenaufrufs nicht in den Geltungsbereich und ist bereit für die Garbage Collection.

Ich sehe auch nichts, das IDisposable implementiert, so dass Sie sich auch keine Gedanken darüber machen müssen, sich dort aufzuräumen.

    
Justin Niessner 30.10.2014 14:52
quelle
4

Wenn Sie die statische Methode 100 Mal aufrufen, wird jedes Mal, wenn die StringBuilder erstellt wird, die Arbeit in der Methode ausgeführt und dann zurückgegeben. Sobald die Methode ausgeführt und zurückgegeben wurde, ist Ihr StringBuilder nicht mehr im Gültigkeitsbereich und wird vom Bereinigungs-Agent bereinigt. Also, ja, wenn Sie die Methode 100 Mal aufrufen, werden 100 Instanzen von StringBuilder erstellt - , aber jeder einzelne von ihnen wird entsorgt und der Müll wird gesammelt.

    
Dave Zych 30.10.2014 14:51
quelle
4

Ja, es ist vollkommen in Ordnung, Objekte in statischen Methoden zu instanziieren. Sie leben im Rahmen der Methode, d. H. Wenn die Methode zurückkehrt, werden sie als Garbage Collection markiert (es sei denn, Sie ordnen sie einem Feld des Parameters oder einem anderen statischen Feld zu). Ja, für jeden Aufruf der Methode werden diese Objekte instanziiert, und das ist wirklich das, was Sie wollen; Andernfalls wäre das Multithreading einer solchen Methode ein PITA.

Wenn Sie ein Objekt wiederverwenden möchten, benötigen Sie ein anderes statisches Feld, auf das von der statischen Methode, die die Referenz enthält, zugegriffen werden kann. Wenn Sie Multithreading verwenden, können Sie zu diesem Zeitpunkt Ressourcen gemeinsam nutzen und entsprechende Vorkehrungen treffen.

    
Janis F 30.10.2014 14:51
quelle
3
  

Statische Methoden werden nicht instanziiert

Methoden werden im Allgemeinen nicht instanziiert, daher gibt es keinen Unterschied bei der Garbage Collection zwischen einer Instanzmethode und einer statischen Methode.

Vielleicht möchten Sie lesen, wie GC funktioniert , aber eine kurze Antwort ist - nein, es gibt kein Speicherleck in diesem Code - lokale Variablen werden entsorgt, sobald der GC feuert und diese nicht mehr erreichbar sind (dh in Ihrem Beispiel endet die Methodenausführung).

    
decPL 30.10.2014 14:54
quelle