2014-10-30 5 views
8

Ich verwende eine Erweiterungsmethode für Zeichenfolge Klasse. Innerhalb dieser Erweiterungsmethode erstelle ich eine Instanz von StringBuilder. HierStatische Methode, die Objektinstanzen enthält, ist das falsch?

ist der Code:

public static string GetPlainTextFromHtml(this string htmlString) 
    { 
     StringBuilder sb = new StringBuilder(); 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(htmlString); 

     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()")) 
     { 
      string text = node.InnerText; 
      if (!string.IsNullOrEmpty(text)) 
       sb.Append(text.Trim()); 
     } 

     return sb.ToString(); 
    } 

Es funktioniert, aber ich habe eine Sorge in Bezug auf die Speicherverwaltung. Statische Methoden werden nicht instanziiert, also was geschieht, 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 von StringBuilder-Instanzen im Speicher?

Würde es Speicherleck verursachen? Stellt Garbage Collector Objektinstanzen bei der Ausführung der statischen Methode zur Verfügung?

+1

'Statische Methoden werden nicht instanziiert' Nicht statische Methoden werden ebenfalls nicht instanziiert. Klasseninstanzen enthalten nur Daten. Methoden werden nur aufgerufen (nicht instanziiert). Der Unterschied besteht darin, dass nicht statische Methoden mit Klasseninstanz und statische Methoden ohne Klasseninstanz aufgerufen werden. –

Antwort

4

Wenn Sie die statische Methode 100 Mal aufrufen, jedes Mal, wenn es die StringBuilder erstellt, führen Sie die Arbeit in der Methode und dann zurück. Sobald die Methode ausgeführt und zurückgegeben wurde, befindet sich Ihr StringBuilder außerhalb des Gültigkeitsbereichs und wird dem Bereinigungsabzug überlassen. Also, ja, wenn Sie die Methode 100 Mal aufrufen, wird es 100 Instanzen der StringBuilder erstellt werden - aber jeder von ihnen wird entsorgt und Müll gesammelt werden.

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 eine PITA.

Wenn Sie ein Objekt recyceln 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 möglicherweise Ressourcen freigeben und Vorkehrungen treffen.

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 nicht darum kümmern müssen, sich danach entweder aufzuräumen.

+0

Ich kann Objektinstanzen in der statischen Methode erstellen.Aber ich las [diese] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members) Microsoft Docs und wir können nicht: 'Statische Methoden und Eigenschaften können nicht auf nicht statische Felder und Ereignisse in ihrem enthaltenden Typ zugreifen, und sie können nicht auf eine Instanzvariable eines Objekts zugreifen, es sei denn, sie wird explizit in einem Methodenparameter übergeben. Was bedeutet diese Aussage? – stom

3

Statische Methoden werden nicht

Methoden im Allgemeinen instanziiert nicht erhalten instanziiert, so gibt es keinen Unterschied in der Garbage Collection zwischen einer Instanzmethode einer statisch.

Vielleicht möchten Sie lesen, wie GC works, aber eine kurze Antwort ist - nein, es gibt keinen Speicherverlust in diesem Code - lokale Variablen werden entsorgt werden, sobald GC Feuer und diese nicht mehr erreichbar sind (dh in Ihrem Beispiel die Methode Ausführung beendet).

Verwandte Themen