具有静态方法的C#类实例与静态类内存使用情况

时间:2010-02-27 17:52:25

标签: c# memory-management static-methods

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#的闲暇时,类实例屈服于垃圾收集。这两种范式是否有任何利弊?有没有时间你有一个永远不需要实例化的类(即某种资源加载器或工厂),但是你还是使用第二种方法来利用垃圾收集?

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

4 个答案:

答案 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)因此使用静态成员肯定更好。那就是他们的目的。