C#类实例与静态方法vs静态类内存使用

在这两种情况下,C#或其他语言如何处理内存分配(和内存取消分配)

1.)调用静态类的方法。

public Program {
    Foo foo = Loader.load();
}

public static Loader {
    public static Foo load() {
        return new Foo();
    }
}

2.)在一个实例上调用一个方法,然后超出范围。

public Program {
    Foo foo = new Loader().load();
}

public Loader {
    public Foo load() {
        return new Foo();
    }
}

我想静态类被加载并保留在内存中;而类的实例则会在C#的休闲中屈服于垃圾收集。这两种模式有什么利弊吗?有没有一段时间,你有一个从来不需要被实例化的课程(即某种资源加载器或工厂),但你使用第二种方法来利用垃圾收集功能?

我的问题的重要部分是,在某些情况下,第一范式在概念上是否正确,可能会遭受不必要的记忆。

最佳答案
你的第二个例子不起作用,所以让我们探讨一下真正的选择:

1.)调用静态类的方法。

public Program {
   Foo foo = Loader.Load();
}

public static Loader {
   public static Foo Load() {
      return new Foo();
   }
}

2.)调用非静态类中的静态方法。

public Program {
   Foo foo = Loader.Load();
}

public Loader {
   public static Foo Load() {
      return new Foo();
   }
}

3.)在一个实例上调用一个实例方法

public Program {
   Foo foo = new Loader().Load();
}

public Loader {
   public Foo Load() {
      return new Foo();
   }
}

两个是相同的。调用静态方法是一样的,不管类是否是静态的。

第三个选项将在堆上创建一个类的实例。由于类没有数据成员,它只能是16字节。最终将垃圾收集,但由于体积小,发生这样的事情并不重要。

调用实例方法也与静态方法略有不同。对类实例的引用一起发送,您可以通过此关键字访问。在这种情况下几乎没有区别,因为对象中没有真正的数据访问。

转载注明原文:C#类实例与静态方法vs静态类内存使用 - 代码日志