我有以下类,方法如下:
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
超出范围,弹出堆栈。
静态方法内部的局部变量本身不是“静态的”,当方法返回时,这些局部变量将与非静态方法一样从执行堆栈中弹出。
anotherFoo
背后的底层对象将在 SomeMethod
返回时符合 GC 条件(好吧,编译器更积极并且可以在 anotherFoo 时使其成为 GC-able
代码中不再使用)。
关于c# - 静态方法内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284895/