当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET中如何确定复杂对象的大小?分享

时间:2023-04-10 17:34:34 C#

.NET中如何确定复杂对象的大小?有没有办法确定.NET中复杂对象的总大小?该对象由其他对象组成,可能包含对其他复杂对象的引用。这个对象封装的一些对象可能是POD,其他的可能不是。您拥有的不是“复杂对象”,而是对象图。要确定它的总大小,您需要遍历图-从一些根对象开始,并使用反射来枚举引用类型的字段并检索它们的值(当然要检查循环)。要获取图中特定对象的大小,请参阅相关问题的答案,但请注意,这是一个邪恶的hack,完全不受支持,可能会损坏(并且可能已经损坏),并且可能导致wholesalekittenracesAnnihilation在天界。也就是说,没有“非hacky”的方法来获取确切的值,因为它是一个定义的实现细节——你不应该对它有任何用处。为了在调试/分析期间找出应用程序的内存使用情况,黑客攻击就足够了。简而言之,没有办法知道。假设所有对象都是可序列化的,您可以使用BinaryFormatter将它们序列化为二进制blob,然后读取其大小。然而,这将包括一些元数据,并扩大实际对象大小(但这将是一个合理的估计)。对于值类型,您可以使用Marshal.SizeOf(),只是它不考虑任何子对象。它将计算任何内部引用类型作为指向它的指针的大小。反射是另一种方式,但不会暴露任何占用内存的私有成员。所以,除非我弄错了,否则实际上没有办法做到这一点。棘手......如果两个对象指向同一个字符串变量,其中一个“拥有”该字符串怎么办?听起来我需要模拟垃圾收集才能得到真正的答案。重量不是很轻。试一试System.Runtime.InteropServices.Marshal.SizeOf()。以前在StackOverflow的其他地方回答过:Findingthesizeofanobjectinstanceinbytesinc#你需要引入不安全的代码(因为这需要指针操作)——代码看起来像这样:staticunsafeintCalcSize(objectobj){RuntimeTypeHandleth=obj.GetType().TypeHandle;整数大小=*(*(int**)&th+1);返回尺寸;还记得将项目设置(项目->构建选项卡)标记为“允许不安全代码”。以上是C#学习教程:.NET中如何确定复杂对象的大小?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: