C# 包含对象实例的静态方法,是否错误?

C# 包含对象实例的静态方法,是否错误?,c#,garbage-collection,static-methods,C#,Garbage Collection,Static Methods,我正在为string类使用扩展方法。在该扩展方法中,我创建了StringBuilder的一个实例 代码如下: public static string GetPlainTextFromHtml(this string htmlString) { StringBuilder sb = new StringBuilder(); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(htm

我正在为string类使用扩展方法。在该扩展方法中,我创建了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实例的副本吗


它会导致内存泄漏吗?当静态方法执行终止时,垃圾收集器是否处理对象实例?

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

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


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

您的代码绝对没有问题

在静态方法内创建实例的方式与在实例方法内创建实例的方式相同。每个调用都将生成一个新实例,但会超出范围,并准备在方法调用结束时进行垃圾收集

我也没有看到任何实现
IDisposable
的东西,因此您也不必担心自己在那里之后的清理工作

静态方法不会被实例化

方法通常不会实例化,所以实例方法和静态方法之间的垃圾收集没有区别


您可能想详细了解如何执行,但简短的回答是-不,这段代码中没有内存泄漏-一旦GC触发并且这些变量不再可访问(即,在您的示例中,方法执行完成),局部变量将被释放。

静态方法不会被实例化
非静态方法也不会被实例化。类实例只包含数据。方法只是被调用(而不是实例化)。区别在于非静态方法是用类实例调用的,而静态方法没有类实例。@AlexF如果实例是在静态方法下创建的,静态方法和属性不能访问非静态字段,这难道不会变成静态的吗?但若stringbuilder实例变为静态,那个么它怎么会被垃圾收集呢?我的头很痛,我可以在静态方法中创建对象实例。但是我在读microsoft文档,它说我们不能:
静态方法和属性不能访问其包含类型中的非静态字段和事件,并且它们不能访问任何对象的实例变量,除非它显式地传递到方法参数中这句话的意思是什么?我是来了解同样的情况的,@justin如果你还积极参与,你介意解释一下斯托姆的问题吗