【发布时间】: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# 指定相同内容时更多。