2014-10-30 2 views
8

Я использую метод расширения для строка класс. В рамках этого метода расширения я создаю экземпляр StringBuilder.Статический метод, содержащий объекты, не так ли?

Вот код:

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

Это работает, но у меня есть беспокойство по поводу управления памятью. Статические методы не создаются, поэтому, если я создаю экземпляр объекта в статическом методе. Скажем, я называю этот статический метод 100 раз, будет ли в памяти 100 экземпляров StringBuilder?

Может ли это вызвать утечку памяти? Собирает ли сборщик мусора экземпляр объекта при завершении статического метода?

+1

'Статические методы не получают экземпляр 'Нестатические методы также не создаются. Экземпляры класса содержат только данные. Методы называются (не создаются). Разница заключается в том, что нестатические методы вызывают с экземпляром класса и статические методы без экземпляра класса. –

ответ

4

Если вы вызываете статический метод 100 раз, каждый раз, когда он создает StringBuilder, выполните работу в методе и затем верните. После того, как метод будет выполнен и возвращен, ваш StringBuilder выходит за пределы области действия и остается убирать сборщик мусора. Итак, да, если вы вызовете метод 100 раз, будет создано 100 экземпляров созданного StringBuilder - , но каждый из них будет удален и собран мусором.

4

Да, совершенно нормально создавать объекты внутри статических методов. Они живут в рамках метода, то есть когда метод возвращается, они будут помечены как собираемые мусором (если вы не назначили их полю параметра или другого статического поля). Да, для каждого вызова метода он будет создавать экземпляры этих объектов, и это действительно то, что вы хотите сделать; в противном случае многопоточность такого метода будет PITA.

Если вы хотите перерабатывать объект, вам нужно получить другое статическое поле, доступное из статического метода, который содержит ссылку. Если вы используете многопоточность, на данный момент вы потенциально обмениваетесь ресурсами и должны принимать меры предосторожности.

10

В коде нет ничего плохого.

Создание экземпляров внутри статического метода работает так же, как создание экземпляров внутри метода экземпляра. Каждый вызов будет генерировать новый экземпляр, но будет выпадать из области видимости и готов к сбору мусора в конце вызова метода.

Я также ничего не вижу, что реализует IDisposable, поэтому вам не нужно беспокоиться о том, чтобы очистить себя после того, как вы там тоже.

+0

Я могу создавать экземпляры объектов внутри статического метода.Но я читал [это] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members) документы microsoft и он говорит, что мы не можем: «Статические методы и свойства не могут получить доступ к нестатическим полям и событиям в их содержащем типе, и они не могут получить доступ к переменной экземпляра любого объекта, если она явно не передана в параметре метода. 'что означает это утверждение? – stom

3

Статические методы не получают инстанцирован

методы в целом не получают экземпляры, так что нет никакой разницы в сборке мусора между методом экземпляра на один статический.

Возможно, вы захотите прочитать о том, как GC works, но короткий ответ - нет утечки памяти в этом коде - локальные переменные будут удаляться после того, как GC загорелись, и они перестанут достижимыми (т. Е. В вашем примере метод исполнение заканчивается).

Смежные вопросы