C# 静态方法内存消耗

C# 静态方法内存消耗,c#,memory,static,C#,Memory,Static,我使用以下方法创建了以下类: public class Foo { public string A {get;set;} public static Foo New(string a) { Foo newFoo = new Foo(); newFoo.A = a; return newFoo; } } public class Bar { public void SomeMethod() { ...

我使用以下方法创建了以下类:

public class Foo
{
   public string A {get;set;}

   public static Foo New(string a)
   {
      Foo newFoo = new Foo();
      newFoo.A = a;
      return newFoo;
   }
 }

 public class Bar
 {
   public void SomeMethod()
   {
       ...
       Foo anotherFoo = Foo.New("a");
       ....
   }
 }

如果Bar类在使用上述代码的过程中创建了Foo,那么Foo是否会超出作用域并被垃圾回收,或者是否会Foo(因为它使用的是静态方法)继续引用变量newFoo,因此另一个foo永远不会超出范围?

静态方法的存在不会影响对象的GC资格,只有对该对象的引用才会影响。在您的情况下,
另一个foo
将是唯一的参考。当方法返回时,引用
newFoo
超出范围,从堆栈中弹出

静态方法中的局部变量本身不是“静态的”,当方法返回时,这些局部变量将与非静态方法一样从执行堆栈中弹出


SomeMethod
返回时,
anotherFoo
后面的底层对象将符合GC的条件(好吧,编译器更具攻击性,当
anotherFoo
不再在代码中使用时,可以使其成为GC)。

a
Foo.New()
完成后立即离开作用域。返回对
newFoo
的引用,然后
newFoo
超出范围
SomeMethod
仍然通过
anotherFoo
引用引用该实例,因此除非保存该引用,否则在
SomeMethod
完成之前,该引用不可用于垃圾收集

类从不“超出范围”。实例(引用)可以。至于newFoo引用,当New方法结束时,它将超出范围,当SomeMethod方法结束时,另一个foo也将超出范围

方法是静态的这一事实不会改变任何东西,事实上,您甚至可以在Foo中有一个静态变量,它不会改变任何东西,因为静态变量是在称为“高频堆”的单独堆上创建的,其中GC显然从不收集任何东西