C#方法会占用内存吗?

4

当有一个拥有50个方法的类,并且我们创建了50个该类的对象实例时,内存会发生什么?对于具有大量功能和较少内存使用的对象,最佳解决方案是什么?


3
据我所知,类的实例仅占用其字段的内存(包括自动属性,因为它们被转换为带有支持字段的普通属性)。 - Zohar Peled
1
@ZoharPeled 您是正确的。方法通过隐式的 this 参数获取它们所在的实例提供的上下文,即它们正在处理的实例,对于静态方法来说不需要上下文。这就是为什么不需要为不同的实例复制方法到内存中的原因。属性只是 getter 和 setter 方法,因此同样适用。这就将字段作为占用内存的实例中的内容。 - ckuri
1
顺便提一下:一个有50个方法的类通常被认为是不好的编程实践。你可能需要检查你的设计,并看看是否所有的方法确实必须放在同一个对象中,而没有其他的方法分组会提供更容易理解/使用你的API。 - Alexei Levenkov
2个回答

5

是的,C#/.Net方法需要基于每个AppDomain的内存,但方法/属性没有单独实例的成本。

成本来自于:

  • 方法元数据(类型的一部分)和IL。我不确定IL保留的时间有多长,因为它只需要即时编译,所以我的猜测是按需加载并且会被丢弃。
  • 方法JIT后的机器码将保留到AppDomain卸载(或者如果编译为中性,则保留到进程终止)

因此,使用50个方法实例化1个对象或50个对象都不会对方法的内存使用量造成影响。


方法的内存是在什么时候分配的?是在对象创建时分配还是在调用方法时分配? - zulqadar idrishi
@zulqadaridrishi 没有头绪(应该在JIT时间)/不太可能有人关心。请提出一个新问题(确保在你的问题中解释为什么需要那些信息)。 - Alexei Levenkov

2

首先,内存使用和功能不是基于对象,而是基于我们创建对象的类...因此,如果您正在创建一个类的对象,则可以访问该类的所有功能..我认为使用对象访问类的功能是更好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接