Bog*_*gac 10 c# static-methods garbage-collection
我正在使用字符串类的扩展方法.在该扩展方法中,我创建了一个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();
}
Run Code Online (Sandbox Code Playgroud)
它有效但我关心内存管理.静态方法没有实例化,所以如果我在静态方法中实例化一个对象会发生什么.假设我将此静态方法称为100次,内存中是否有100个StringBuilder实例副本?
它会导致内存泄漏吗?当静态方法执行终止时,垃圾收集器是否处置对象实例?
Jus*_*ner 10
你的代码绝对没有问题.
在静态方法中创建实例的方式与在实例方法中创建实例的方式相同.每次调用都会生成一个新实例,但会超出范围,并在方法调用结束时准备好进行垃圾回收.
我也没有看到任何实施的东西,IDisposable所以你不必担心在那之后清理.
如果调用静态方法 100 次,每次都会创建StringBuilder,执行方法中的工作,然后返回。一旦该方法被执行并返回,您的方法StringBuilder就超出了范围,并留给垃圾收集器来清理。所以,是的,如果您调用该方法 100 次,就会创建 100 个实例StringBuilder-但它们中的每一个都将被释放并被垃圾收集。
是的,完全可以在静态方法中实例化对象。它们存在于方法的范围内,即,当方法返回时,它们将被标记为垃圾回收(除非您将它们分配给参数的字段或其他静态字段)。是的,对于方法的每次调用,它都会实例化那些对象,而这正是您想要的。否则,多线程这种方法将是PITA。
如果要回收对象,则需要具有一个包含引用的静态方法可访问的另一个静态字段。如果您使用多线程,那么此时您可能正在共享资源,并且需要采取预防措施。