2012-08-15 118 views
4

从内存分配的角度来看,创建无状态静态实用类与无状态非静态实用类有什么区别吗?根据我的理解,静态类可能实际上会更好,因为在GC堆上不会分配对象。只有方法表将在高频堆上创建,而对于非静态类,将在GC堆上与HF堆上的方法表一起创建一个对象。需要你们的帮助来确认它,并请告诉我是否缺少其他考虑因素。实用程序/助手无状态静态类vs无状态非静态类

+2

微。优化。 – Oded 2012-08-15 19:00:12

+0

确实......你需要做多少个非静态类的实例化? – spender 2012-08-15 19:09:18

+0

@spender:这是我认为需要建议的地方。一个非静态类将不得不被实例化,以便访问任何成员,而静态类不会有这样的需求。一个非静态类可以实现为单例类,以避免多个实例,因为空对象会消耗12个字节的内存,但如果类由纯实用程序成员组成,那么这似乎不值得付出努力。 – jags 2012-08-15 19:36:54

回答

4

是的。如果这些方法都是静态的,那么没有实例将在托管堆上。每次调用时,都会直接引用该类型并访问它的成员,而无需在堆上分配内存。

如果您有一个实例类,那么每次创建实例时,都会在堆上产生成本。如果你还没有坚持引用,那么你将在CLR的第0代产生高流失。这假定你将创建大量的对象来进行这些调用。

当然,如果您正在实施the singleton pattern,那么成本将会很小,因为您只需实施一个单个实例对象。

但是,这一切都没有实际意义,因为它是一个micro optimization;除非您发现自己创建了大量这些对象来执行此功能,并且通过分析确定您实际上存在问题,那么它应该是最简单的维护问题。

虽然我会说,如果一个方法是无状态的,它自然看起来像它将运行一个现有的类型,那么我通常会写一个extension method;它是一个静态的调用,但给出了一个实例调用的外观,这对于一些(和我本人而言)在代码中具有比直接调用静态方法更好的流程(尤其是当它使我能够设计fluent interface时)。

+0

非常感谢!扩展方法绝对是实现帮助器方法的更好方法。 – jags 2012-08-15 19:49:50