静态方法内存消耗

我有以下类,具有以下方法:

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,因此anotherFoo永远不会去超出范围?

静态方法的存在不会影响对象对GC的合格性,只会引用该对象的引用。 在你的情况下, anotherFoo将是唯一的参考。 当方法返回时,引用newFoo超出范围,弹出堆栈。

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

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

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

类从不“超出范围”。 实例(参考)做。 对于newFoo引用,当NewMethod方法结束时,当New结束时,它将超出范围。

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