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