Utility / Helper无状态静态类vs无状态非静态类

时间:2012-08-15 18:55:58

标签: c# .net

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

1 个答案:

答案 0 :(得分:4)

是。如果方法都是静态的,则托管堆上不会有任何实例。每次调用时,都会直接引用类型并访问它的成员而不在堆上分配内存。

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

当然,如果您正在实施the singleton pattern,那么费用就会很小,因为您只需要实现对象的单个实例。

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

我会说,如果一个方法是无状态的,并且它自然看起来会在现有类型下运行,那么我通常会写一个extension method;它是一个静态调用,但给出了一个实例调用的外观,对某些人(我个人而言)在代码中有一个比直接调用类型的静态方法更好的流程(特别是当它使我能够设计一个{{3 }})。