[英]C# class instance with static method vs static class memory usage
在这两种情况之间,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个字节。 它最终将被垃圾收集,但由于体积小,发生这种情况时并不重要。
调用实例方法与静态方法略有不同。 将发送对类实例的引用,您可以通过this
关键字进行访问。 在这种情况下几乎没有区别,因为要访问的对象中没有真实数据。
即使没有创建类的实例,静态方法,字段,属性或事件也可在类上调用。
http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
因此,从这个意义上讲,静态方法的行为与在类实例中使用它时的行为一样:它的作用域是类型。
第二种形式创建一个临时的Loader
对象(非常便宜)。 无论您选择哪种方法,您都必须加载Loader类。
这里获得的性能(内存节省)非常少。 如果在本地变量方法之外不需要“状态”,则通常会选择静态类中的静态成员。
我找不到任何这方面的资源,但是根据我的编程知识,当你引用一个类(非静态)时,它的结构被加载到内存中
创建类的实例只是为了调用方法,会浪费大量的处理能力(由于创建实例,分配内存和垃圾收集)。
不是保留定义,而是保持定义,而不是保持定义。 为什么不保持定义(静态)。
只要您不在静态变量中存储任何数据,静态方法就应该占用与非静态方法定义相同的内存量。 但是使用静态方法时,只有方法将保留在内存中,并且随时可以在不创建实例的情况下调用。 其中,如果方法是非静态的,则需要实例化(使用内存和处理能力)并收集垃圾(释放内存并使用cpu),因此使用静态成员肯定更好。 那就是他们在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.