包含对象实例的静态方法,是不是错了?

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所以你不必担心在那之后清理.


Dav*_*ych 6

如果调用静态方法 100 次,每次都会创建StringBuilder,执行方法中的工作,然后返回。一旦该方法被执行并返回,您的方法StringBuilder就超出了范围,并留给垃圾收集器来清理。所以,是的,如果您调用该方法 100 次,就会创建 100 个实例StringBuilder-但它们中的每一个都将被释放并被垃圾收集。


Jan*_*s F 5

是的,完全可以在静态方法中实例化对象。它们存在于方法的范围内,即,当方法返回时,它们将被标记为垃圾回收(除非您将它们分配给参数的字段或其他静态字段)。是的,对于方法的每次调用,它都会实例化那些对象,而这正是您想要的。否则,多线程这种方法将是PITA。

如果要回收对象,则需要具有一个包含引用的静态方法可访问的另一个静态字段。如果您使用多线程,那么此时您可能正在共享资源,并且需要采取预防措施。