我一直在搜索C#语言规范,但我找不到任何说明指针类型(例如int*
)是否使用默认值初始化的内容。我创建了一个简单的测试应用程序,似乎将它们初始化为零,但我想用规范确认。
我开始寻找这个,因为我在反射器中注意到IntPtr
类使用此代码来定义其IntPtr.Zero
:
public struct IntPtr : ISerializable
{
private unsafe void* m_value;
public static readonly IntPtr Zero;
.......
public static unsafe bool operator ==(IntPtr value1, IntPtr value2)
{
return (value1.m_value == value2.m_value);
}
........
}
这意味着当您与IntPtr.Zero
进行比较时,它实际上是与分配给m_value
字段void*
的默认值进行比较。
感谢。
答案 0 :(得分:1)
我相信指针没有默认值;由于指针的值是包含您分配给它的内容的一部分内存的地址。如果你还没有分配它,它可能指向内存中的任何东西。
也许CLR的默认行为是将其设置为IntPtr.Zero,“表示已经初始化为零的指针或句柄”,这看起来可能来自Carmelo Floridia的回答。这似乎是规范可能没有详细阐述的实现细节。
答案 1 :(得分:1)
按规范指针类型的默认值为null
。这是两个事实。
第一个事实是指针是引用类型。它在ECMA-335中描述:
答案 2 :(得分:-1)
使用Visual Studio调试器,您可以获取分配给int指针的默认值。在32位架构中,它是0x00000000(32 0位)。
class Program
{
private static unsafe int* m_value;
static void Main(string[] args)
{
} // <<== Break point here
}
Watch Window
_____________________________________________
Name Value Type
======= ========== ========
m_value 0x00000000 int*