繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM