如何确定.NET中复杂对象的大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

有没有方法可以确定.NET中复杂对象的总大小?该对象由其他对象组成,并可能持有对其他复杂对象的引用。这个对象封装的一些对象可能是POD,其他的可能不是。

提问于
用户回答回答于

你有什么不是一个“复杂的对象”,它是一个对象图。要确定它的总大小,你需要走这个图 - 从一些根对象开始,并使用反射枚举引用类型的字段并检索它们的值(当然还有检查循环)。

请注意,这是一个完全不受支持的恶意破解,可能会破坏(并且可能已经被破坏),并可能导致批发小猫种族灭绝在天上的球体。也就是说,没有“非黑客”的方式来获得准确的价值,因为它是按定义的实现细节 - 你不应该有任何用处。为了在调试/分析过程中找出应用程序的内存使用情况,黑客已经足够好了。

用户回答回答于

简而言之,没有办法知道。假设所有对象都是可序列化的,可以使用BinaryFormatter将它们序列化成二进制blob,然后读取它的大小。但是,这将包括一些元数据,并夸大实际的对象大小(但这将是一个合理的估计)。

对于值类型,可以使用Marshal.SizeOf(),只有它不包含任何子对象。它会计算任何内部引用类型作为指向它的指针的大小。

反思是另一种方式,但不会暴露任何私人成员的内存。所以,除非我错了,否则没有办法真正做到这一点。

扫码关注云+社区