从内存分配的角度来看,创建无状态静态实用类与无状态非静态实用类有什么区别吗?根据我的理解,静态类可能实际上会更好,因为在GC堆上不会分配对象。只有方法表将在高频堆上创建,而对于非静态类,将在GC堆上与HF堆上的方法表一起创建一个对象。需要你们的帮助来确认它,并请告诉我是否缺少其他考虑因素。实用程序/助手无状态静态类vs无状态非静态类
4
A
回答
4
是的。如果这些方法都是静态的,那么没有实例将在托管堆上。每次调用时,都会直接引用该类型并访问它的成员,而无需在堆上分配内存。
如果您有一个实例类,那么每次创建实例时,都会在堆上产生成本。如果你还没有坚持引用,那么你将在CLR的第0代产生高流失。这假定你将创建大量的对象来进行这些调用。
当然,如果您正在实施the singleton pattern,那么成本将会很小,因为您只需实施一个单个实例对象。
但是,这一切都没有实际意义,因为它是一个micro optimization;除非您发现自己创建了大量这些对象来执行此功能,并且通过分析确定您实际上存在问题,那么它应该是最简单的维护问题。
虽然我会说,如果一个方法是无状态的,它自然看起来像它将运行一个现有的类型,那么我通常会写一个extension method;它是一个静态的调用,但给出了一个实例调用的外观,这对于一些(和我本人而言)在代码中具有比直接调用静态方法更好的流程(尤其是当它使我能够设计fluent interface时)。
+0
非常感谢!扩展方法绝对是实现帮助器方法的更好方法。 – jags 2012-08-15 19:49:50
相关问题
- 1. 静态与非静态类
- 2. 无状态EJB中的静态vs实例成员
- 3. 从静态类触发非静态类?
- 4. 访问非静态类的静态类
- 5. Combinig静态类和非静态类
- 6. 使用静态或非静态类
- 7. Java:非静态类和静态调用
- 8. C#静态类 - 静态类不能有非静态成员
- 9. 静态类中的静态变量和非静态类中的静态变量
- 10. 无法对非静态类成员进行静态引用
- 11. 无法对非静态类型进行静态引用T
- 12. 静态主类静态类?
- 13. C# - 非静态类的静态事件
- 14. c#静态或非静态类
- 15. 声明非静态类静态
- 16. 非静态类的静态成员?
- 17. 声明类的静态和非静态
- 18. SQLite C中的静态和非静态准备状态API
- 19. 静态形状
- 20. 多线程(无状态类)
- 21. 无状态的饼干VS全状态
- 22. Keras - 有状态vs无状态LSTM
- 23. Android的静态VS非静态问题
- 24. 想从非静态类访问静态成员的非静态子类的Java
- 25. 静态文件状态'404
- 26. 在助手类中使用静态方法与非静态方法
- 27. 如何序列化非静态子类的静态类
- 28. 静态类vs单身类
- 29. 静态方法vs静态实例
- 30. 静态标准:非静态方法日期实用程序
微。优化。 – Oded 2012-08-15 19:00:12
确实......你需要做多少个非静态类的实例化? – spender 2012-08-15 19:09:18
@spender:这是我认为需要建议的地方。一个非静态类将不得不被实例化,以便访问任何成员,而静态类不会有这样的需求。一个非静态类可以实现为单例类,以避免多个实例,因为空对象会消耗12个字节的内存,但如果类由纯实用程序成员组成,那么这似乎不值得付出努力。 – jags 2012-08-15 19:36:54