我正在尝试调查带有枚举键的字典是否仍然在较新版本的.Net中生成垃圾(比如> = 4)
请参阅Shawn Hargreaves博客文章,了解为何我甚至为此烦恼……
(http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx)
非常具体我知道但是xBox上的垃圾是/可能是一个非常棘手的问题.
我创建了一个小的.Net v4控制台应用程序,比较为Dictionary和Dicationary生成的IL,并注意到两组代码中的“盒子”操作码,这让我很困惑.
.method private hidebysig instance int32 FindEntry ( !TKey key ) cil managed { // Method begins at RVA 0x61030 // Code size 138 (0x8a) .maxstack 3 .locals init ( [0] int32,[1] int32 ) IL_0000: ldarg.1 IL_0001: Box !TKey <----Hmmmm! IL_0006: brtrue.s IL_000e IL_0008: ldc.i4.5 IL_0009: call void System.ThrowHelper::ThrowArgumentNullException(valuetype System.ExceptionArgument) IL_000e: ldarg.0 IL_000f: ldfld int32[] class System.Collections.Generic.Dictionary`2<!TKey,!TValue>::buckets IL_0014: brfalse.s IL_0088
https://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.box%28v=vs.110%29.aspx
Convert a value type (of the type specified in valTypeToken) to a true
object reference.
这里的盒子不是堆分配吗?如果没有,那么我怎么知道何时存在可能导致XBox崩溃的堆分配?(从查看IL)它是否依赖于其他一些上下文?
内存分析器(例如CLR Profiler)是唯一可以确定的方法吗?