Значение по умолчанию для С# типа указателя
Я искал спецификацию языка С#, и я не могу найти ничего, что говорит о том, что тип указателя (например, 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*
.
Спасибо.
Ответы
Ответ 1
Я считаю, что указатели не имеют значения по умолчанию; из-за значения указателя, являющегося адресом части памяти, содержащей то, что вы назначили ей. Если вы его не назначили, это может указывать на что-либо в памяти.
Возможно, по умолчанию для CLR установлено значение IntPtr.Zero, которое "представляет указатель или дескриптор, который был инициализирован до нуля", который, скорее всего, от ответа Кармело Флоридии. Это, кажется, деталь реализации, о которой спецификатор, возможно, не уточнил.
Ответ 2
Значение по умолчанию для типов указателей по спецификациям null
. Это следует из двух фактов.
Первый факт заключается в том, что указатель является ссылочным типом. Это описано в ECMA-335:
![введите описание изображения здесь]()
Второй факт заключается в том, что reference-type имеет значение по умолчанию - null.
Ответ 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*