Подтвердить что ты не робот

Значение по умолчанию для С# типа указателя

Я искал спецификацию языка С#, и я не могу найти ничего, что говорит о том, что тип указателя (например, 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*.

Спасибо.

4b9b3361

Ответ 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*