c# - 静态方法内存消耗

标签 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()
   {
       ...
       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/

相关文章:

c++ - 如何在静态函数中使用成员函数数组?

c++ - 从动态 dll 访问静态链接库中的静态变量/函数

c# - 从 XmlDocument 的 NodeList 中获取属性?

c# - (Unity) 使用 BuildPipeline 构建时启用 App Bundle (Google Play) 选项?

c++ - 为什么将空结构插入保留 vector 会增加内存?

c++ - 当getline()读取的行大于系统内存时会发生什么?

c# - 这个 LINQ 性能从何而来?

c# - HTTP 发布错误 : An existing connection was forcibly closed by the remote host

c# - 由 C# EF 核心调用时的暂停选择查询,MSSQL 管理工作室可以很好地执行查询。为什么?

java - 为什么实现接口(interface)的类不能使用 Java 中该接口(interface)的静态方法?