从内存分配的角度来看,创建无状态静态实用程序类与无状态非静态实用程序类之间有什么区别吗?根据我的理解,静态类实际上可能更好,因为不会在 GC Heap 上分配对象。只有方法表将在高频堆上创建,而对于非静态类,将在 GC 堆上创建一个对象,同时在 HF 堆上创建一个方法表。需要你们的帮助来确认它,如果我遗漏了任何其他注意事项,请告诉我。
问问题
2061 次
1 回答
5
是的。如果方法都是静态的,那么托管堆上不会有任何实例。每次调用时,您将直接引用该类型并访问它的成员,而无需在堆上分配内存。
如果您有一个实例类,那么每次创建实例时,都会在堆上产生成本。如果您也没有保留参考,那么您将在 CLR 的第 0 代中出现高流失率。这假设您将创建大量对象来进行这些调用。
当然,如果您正在实现单例模式,那么成本会很小,因为您只会实现对象的单个实例。
然而,这一切都没有实际意义,因为它是一个微优化;除非您发现自己创建了大量的这些对象来执行此功能,并且通过分析确定您确实有问题,否则应该是最容易维护的问题。
不过,我会说,如果一个方法是无状态的,并且它自然看起来会在现有类型上运行,那么我通常会编写一个扩展方法;它是一个静态调用,但给出了一个实例调用的外观,对于某些人(以及我个人)来说,它的代码流程比直接从类型调用静态方法要好得多(尤其是当它使我能够设计一个流畅的接口时) .
于 2012-08-15T19:41:05.970 回答