【问题标题】:C# default value of a pointer typeC# 指针类型的默认值
【发布时间】:2015-04-06 15:41:39
【问题描述】:

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

谢谢。

【问题讨论】:

  • 规范中有一些部分讨论了指针,它们讨论了它们如何与明确的分配分析交互。鉴于明确赋值分析的全部目的是避免观察变量的未初始化状态,也许答案是 Mu。此外,并非您在框架类型的实现中看到的所有内容都是完整的 - 有时运行时的特殊处理会产生实际行为。
  • 很好发现...看起来他们在编写规范时错过了它。猜猜你可以假设它是零(空):-)
  • 令人困惑的是,CIL 将指针类型定义为引用类型的子集,而 C# 将指针类型定义为不同的类型类。因此,当 CIL 指定引用类型具有默认值 null 时,这意味着比 C# 指定相同内容时更多。

标签: c# pointers unsafe


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    指定的指针类型的默认值为null。这是基于两个事实。

    第一个事实是指针是引用类型。在ECMA-335 中有描述:

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

    【讨论】:

    • Type.IsClass 在指针上是 truedefault(typeof(void*))IntPtr.Zero,不为空。引用类型没有默认值 null always 或指针不是引用类型。我相信是前者。
    • @nawfal IntPtr.Zero 默认初始化。第一个字段IntPtr.Zeroprivate unsafe void* m_value。如果void * m_valueIntPtr.Zero,那么我们有递归的相似性。
    【解决方案3】:

    使用 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*
    

    【讨论】:

    • 是的,正如我所说,我编写了一个测试应用程序,但这并不一定意味着该值将始终为零(可能只是运气)。
    • C# 规范非常谨慎地没有定义指针的默认值。
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2015-05-04
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多