jtb*_*jtb 21 c# static-methods memory-management
在这两种情况之间,C#或其他语言如何处理内存分配(和内存解除分配):
1.)调用静态类的方法.
public Program {
Foo foo = Loader.load();
}
public static Loader {
public static Foo load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
2.)在一个实例上调用一个方法,然后该方法超出范围.
public Program {
Foo foo = new Loader().load();
}
public Loader {
public Foo load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
我想静态类在内存中被加载并保留; 而C#的闲暇时,类实例屈服于垃圾收集.这两种范式是否存在任何利弊?有没有时间你有一个永远不需要实例化的类(即某种资源加载器或工厂),但你还是使用第二种方法来利用垃圾收集?
我的问题的重要部分是,第一范式是否在某些情况下在概念上是正确的,可能会遭受不必要的记忆.
你的第二个例子不起作用,所以让我们探索真正的选择:
1.)调用静态类的方法.
public Program {
Foo foo = Loader.Load();
}
public static Loader {
public static Foo Load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
2.)调用非静态类中的静态方法.
public Program {
Foo foo = Loader.Load();
}
public Loader {
public static Foo Load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
3.)在实例上调用实例方法
public Program {
Foo foo = new Loader().Load();
}
public Loader {
public Foo Load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
两者首先是相同的.无论该类是否为静态,调用静态方法都是相同的.
第三个选项将在堆上创建类的实例.由于该类没有数据成员,因此它只有16个字节.它最终将被垃圾收集,但由于体积小,发生这种情况时并不重要.
调用实例方法与静态方法略有不同.将发送对类实例的引用,您可以通过该this关键字进行访问.在这种情况下几乎没有区别,因为要访问的对象中没有真实数据.
| 归档时间: |
|
| 查看次数: |
15549 次 |
| 最近记录: |