C#指针类型的默认值

时间:2015-02-06 13:21:37

标签: c# pointers unsafe

我一直在搜索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*的默认值进行比较。

感谢。

3 个答案:

答案 0 :(得分:1)

我相信指针没有默认值;由于指针的值是包含您分配给它的内容的一部分内存的地址。如果你还没有分配它,它可能指向内存中的任何东西。

也许CLR的默认行为是将其设置为IntPtr.Zero,“表示已经初始化为零的指针或句柄”,这看起来可能来自Carmelo Floridia的回答。这似乎是规范可能没有详细阐述的实现细节。

答案 1 :(得分:1)

按规范指针类型的默认值为null。这是两个事实。

第一个事实是指针是引用类型。它在ECMA-335中描述: enter image description here

第二个事实是reference-type has default value - null

答案 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*