Я искал спецификацию языка C#, и я не могу найти ничего, что говорит о том, что тип указателя (например, int*
) инициализируется значением по умолчанию. Я создал простое тестовое приложение и, похоже, инициализирует их до нуля, но я хотел бы подтвердить это с помощью спецификации.C# значение по умолчанию для типа указателя
я начал искать это, потому что я заметил в отражателе 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*
.
Спасибо.
Есть части спецификации, обсуждающие указатели, в которых обсуждается, как они взаимодействуют с определенным анализом присваивания. Учитывая, что вся точка определенного анализа присваивания заключается в том, чтобы избежать вас, наблюдая неинициализированное состояние переменной, возможно, ответ Му. Кроме того, не все, что вы видите в реализации типов фреймворков, - это полная история - иногда специальная обработка по времени выполнения приводит к фактическому поведению. –
Хорошо заметили ... похоже, что они пропустили это при написании спецификации. Угадайте, что вы можете предположить, что это ноль (null) :-) – buffjape
Смущает то, что CIL определяет типы указателей как подмножество ссылочных типов, но C# определяет типы указателей как отдельный класс типов. Поэтому, когда CIL указывает, что ссылочные типы имеют значение по умолчанию «null», это означает больше, чем когда C# указывает то же самое. – hvd