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#的闲暇时,类实例屈服于垃圾收集。这两种范式是否有任何利弊?有没有时间你有一个永远不需要实例化的类(即某种资源加载器或工厂),但是你还是使用第二种方法来利用垃圾收集?
我的问题的重要部分是,第一范式是否在某些情况下在概念上是正确的,可能会遭受不必要的记忆。
答案 0 :(得分:9)
你的第二个例子不起作用,所以让我们探索真正的选择:
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个字节。它最终将被垃圾收集,但由于尺寸较小,当发生这种情况时并不重要。
调用实例方法与静态方法略有不同。会发送对类实例的引用,您可以通过this
关键字进行访问。在这种情况下几乎没有区别,因为要访问的对象中没有真实数据。
答案 1 :(得分:1)
即使没有创建类的实例,静态方法,字段,属性或事件也可以在类上调用。
http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
因此,在这种意义上,您的静态方法的行为与在类实例中使用它时的行为一样:它的作用域是类型。
答案 2 :(得分:1)
第二种形式创建一个临时的Loader
对象(非常便宜)。无论您选择哪种方法,您都必须加载Loader类。
这里获得的性能(内存节省)非常少。如果在本地变量方法之外不需要“状态”,则通常会选择静态类中的静态成员。
答案 3 :(得分:0)
我找不到任何这方面的资源,但是根据我的编程知识,当你引用一个类(非静态)时,它的结构被加载到内存中
创建类的实例只是为了调用方法,会浪费很多处理能力(由于创建实例,分配内存和垃圾收集)。
不是保留定义,而是保持定义,而不是保持定义。为什么不保持定义(静态)。
只要您不在静态变量中存储任何数据,静态方法就会占用与非静态方法定义相同的内存量。但是使用静态方法时,只有方法将保留在内存中,并且随时可以在不创建实例的情况下调用。其中,如果方法是非静态的,则需要实例化(使用内存和处理能力)并收集垃圾(释放内存并使用cpu)因此使用静态成员肯定更好。那就是他们的目的。