2014-10-30 8 views
8

Sto utilizzando un metodo di estensione per la classe . All'interno di tale metodo di estensione creo un'istanza di StringBuilder.Metodo statico contenente istanze di oggetto, è sbagliato?

Ecco il codice:

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(); 
    } 

Funziona ma ho una preoccupazione per quanto riguarda la gestione della memoria. I metodi statici non vengono istanziati, quindi cosa succede se istanzio un oggetto nel metodo statico. Diciamo che chiamo questo metodo statico 100 volte, ci sarebbero 100 copie di istanze di StringBuilder in memoria?

Potrebbe causare una perdita di memoria? Garbage Collector elimina l'istanza dell'oggetto quando viene interrotta l'esecuzione del metodo statico?

+1

'I metodi statici non vengono istanziati. Anche i metodi non statici non vengono istanziati. Le istanze di classe contengono solo dati. I metodi sono appena chiamati (non istanziati). La differenza è che i metodi non statici vengono chiamati con istanza di classe e metodi statici senza istanza di classe. –

risposta

4

Se si chiama il metodo statico 100 volte, ogni volta che verrà creato il StringBuilder, eseguire il lavoro nel metodo e quindi restituire. Una volta eseguito e reso il metodo, lo StringBuilder è fuori ambito e viene lasciato al garbage collector per la pulizia. Quindi, sì, se si chiama il metodo 100 volte ci saranno 100 istanze di StringBuilder create - ma ciascuna di esse verrà eliminata e raccolta di dati inutili.

4

Sì, è perfettamente corretto creare istanze di oggetti all'interno di metodi statici. Esse vivono nell'ambito del metodo, cioè quando il metodo restituisce, saranno contrassegnate come garbage collection (a meno che non le si assegni a un campo del parametro o ad un altro campo statico). Sì, per ogni chiamata al metodo, istanzia gli oggetti, ed è proprio quello che vuoi che faccia; altrimenti, il multithreading di questo metodo sarebbe un PITA.

Se si desidera riciclare un oggetto, è necessario disporre di un altro campo statico accessibile dal metodo statico che contiene il riferimento. Se si utilizza il multithreading, a questo punto si stanno potenzialmente condividendo risorse e si devono prendere precauzioni.

10

Non c'è assolutamente niente che non va nel tuo codice.

La creazione di istanze all'interno di un metodo statico funziona allo stesso modo della creazione di istanze all'interno di un metodo di istanza. Ogni chiamata genererà una nuova istanza, ma non rientrerà nell'ambito e sarà pronta per la garbage collection alla fine della chiamata al metodo.

Anche io non vedo nulla che implementa IDisposable così non devi preoccuparti di ripulirti anche da solo.

+0

Posso creare istanze di oggetto all'interno del metodo statico.Ma stavo leggendo [questo] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members) microsoft docs e dice che non possiamo: 'I metodi e le proprietà statiche non possono accedere a campi ed eventi non statici nel loro tipo di contenitore e non possono accedere a una variabile di istanza di alcun oggetto a meno che non sia passato esplicitamente in un parametro del metodo. 'cosa significa questa affermazione? – stom

3

I metodi statici non vengono istanziati

metodi, in generale, non vengono istanziati, quindi non c'è alcuna differenza di garbage collection tra un metodo di istanza di uno statico.

Si potrebbe leggere come GC works, ma una risposta breve è - no non c'è perdita di memoria in questo codice - le variabili locali verranno smaltite una volta che GC si attiva e quelle non sono più raggiungibili (ad esempio nell'esempio il metodo finiture di esecuzione).

Problemi correlati