调试器将指针类型静态字段的值显示为零0x0,而实际上它具有有效值

我尝试使用类型uint*访问struct的静态字段的值时遇到此行为

在调试时,监视窗口将静态字段StaticBitMask的值显示为零,但实际上(并且如预期的那样)它是一个有效指针,并且Console.WriteLine()打印它,如下面的控制台输出中所示:

 Pointers: ----------------- Static bitmask pointer: 0x706790 Instance bitmask pointer: 0x708A20 Values: ----------------- Static bitmask pointer val: 0xFFFFFFFF Instance bitmask pointer val: 0xFFFFFFFF 

固定实例字段未观察到此不一致行为。 对于那些,可以在观察窗口中看到实际值并打印出来。

观察窗口

为什么会这样? 我知道顺便说一句,这不是一个表明,但为什么,一个奇迹。

此外,在结构中使用指针类型的静态字段会带来什么后果? 由于它不能被标记为fixed ,它是否可能随时随地移动购买GC?

以下是源代码,您可以直接作为控制台应用程序运行以重现问题。

谢谢。

 using System; using System.Runtime.InteropServices; public unsafe struct UIntBitMask { private static int uintNumberOfBits = sizeof(uint) * 0x8; public static uint* StaticBitMask; public fixed uint InstanceBitMask[1024]; // uintNumberOfBits * uintNumberOfBits = 32 * 32 = 1024 public UIntBitMask(bool fillBitMask) { GetUnmanagedBitMask(); } static UIntBitMask() { IntPtr pointer = Marshal.AllocHGlobal(uintNumberOfBits * uintNumberOfBits * sizeof(uint)); StaticBitMask = (uint*)pointer.ToPointer(); for (int i = 0; i < uintNumberOfBits; i++) for (int j = 0; j > (uintNumberOfBits - j)) << i); } private void GetUnmanagedBitMask() { fixed (uint* structPointer = InstanceBitMask) { for (int i = 0; i < uintNumberOfBits; i++) for (int j = 0; j > (uintNumberOfBits - j)) << i); } } } public class PointerTypeStaticFieldLab { static unsafe void Main() { UIntBitMask instance = new UIntBitMask(true); Console.WriteLine("Pointers:"); Console.WriteLine("-----------------"); Console.WriteLine("Static bitmask pointer: 0x{0:X}", new IntPtr(UIntBitMask.StaticBitMask).ToInt64()); Console.WriteLine("Instance bitmask pointer: 0x{0:X}", new IntPtr(instance.InstanceBitMask).ToInt64()); Console.WriteLine(); Console.WriteLine("Values:"); Console.WriteLine("-----------------"); Console.WriteLine("Static bitmask pointer val: 0x{0:X}", UIntBitMask.StaticBitMask[0]); Console.WriteLine("Instance bitmask pointer val: 0x{0:X}", instance.InstanceBitMask[0]); } }