Что такое null в С#, java?

Как... это 0 как в С++? Или это какой-то "специальный" объект? Или может быть что-то совершенно другое?

- EDIT -

Я знаю, что это за, вопрос скорее - как это делается

Ответы

Ответ 1

Поскольку вы запрашиваете информацию о реализации, а не семантику, ответ специфичен для данной реализации.

В С# есть три вещи, которые могут быть "null". Ссылка, указатель и тип с нулевым значением.

Реализация С# в CLR представляет нулевую ссылку нулевыми битами. (Где количество бит - это соответствующий размер, который должен быть управляемым указателем на конкретную версию CLR, которую вы запускаете.)

Неудивительно, что нулевой указатель представляется одинаково. Вы можете продемонстрировать это на С#, сделав небезопасный блок, сделав нулевой указатель на void, а затем преобразовывая его в IntPtr, а затем преобразуйте IntPtr в int (или long, на 64-разрядные системы). Конечно, вы получите нуль.

Нулевой тип значения NULL также реализуется нулями, хотя и по-другому. Когда вы скажете

Int? j = null;

то, что мы на самом деле создаем, является моральным эквивалентом:

struct NullableInt 
{
    int value;
    bool hasValue;
}

С соответствующими методами доступа и т.д. Когда одной из этих вещей присваивается значение null, мы просто заполняем все это нулевыми битами. Значение представляет собой целое число 0, а hasValue заполняется нулями и поэтому становится false; тип nullable с полем hasValue, установленным в false, считается нулевым.

Я не знаю, какие детали реализации находятся в других реализациях С#/CLI. Я был бы удивлен, если бы они были другими; это очевидный и разумный способ реализации нулей. Но если у вас есть вопросы о конкретной детализации реализации, вам нужно спросить кого-то, кто знает об интересующей вас реализации.

Ответ 2

Так как Java и С# работают на виртуальных машинах, не имеет значения, что физически используется для представления null, и это не обязательно одно и то же в реализациях.

Важно то, что поведение null, как определено в спецификации языка (подробности см. в ответах Дэн и MRFerocius). В принципе, это специальное значение, которое могут иметь переменные ссылочного типа и которые не могут быть разыменованы.

BTW, в качестве контрольной точки, спецификация сериализации Java использует однобайтовое значение 0x70 для представления нулевой ссылки.

Ответ 3

Раздел 4.1 Спецификация языка Java:

Существует также специальный нулевой тип, тип выражения null, который имеет без имени. Поскольку нулевой тип не имеет имя, невозможно объявить переменная нулевого типа или к нулевому типу. Нулевая ссылка является единственным возможным значением выражение нулевого типа. Нулевой ссылка всегда может быть передана любому ссылочный тип. На практике программист может игнорировать нулевой тип и просто притворяйтесь, что null - это просто специальный литерал, который может быть любого ссылочный тип.

Ответ 4

От Microsoft MDSN:

Ключевое слово null - это литерал, представляющий нулевую ссылку, которая не относится ни к одному объекту. Значение null является значением по умолчанию для переменных ссылочного типа. Обычные типы значений не могут быть нулевыми. Однако в С# 2.0 были введены типы значений NULL. См. Nullable Types (Руководство по программированию на С#).

Ответ 6

Это специальная ссылка (чтобы отличить ее от 0), которая ничего не указывает.

Ответ 7

null - это "ссылка" на ничего, поэтому он буквально ничего не указывает.

Дополнительная информация: Тип ссылки С# может указывать на нуль (т.е. ничего), тип значения, такой как int, не может указывать на нуль, хотя тип valueet может использоваться в ссылочном ссылочном типе Nullable.

Ответ 8

его эквивалент

#define NULL (void*)0

в С++. Так что в принципе, да, это ноль.

EDIT: Поскольку я, по-видимому, не ответил на этот вопрос где-нибудь рядом...

Я имел в виду следующее:

Поскольку С# работает в VM, то, что сказал Майкл Боргвардт, правильно, мы не знаем, как его представляли за кулисами. Однако, если вы берете следующий код:

    unsafe static void Main(string[] args)
    {
        if (((void*)0) == null)
            Console.WriteLine("true");
        else
            Console.WriteLine("false");

        Console.ReadKey();
    }

и скомпилировать его в консольном приложении с включенным "Разрешить небезопасный код", вы увидите, что в С# значение null действительно равно (void *) 0.

Ответ 9

Нуль буквально ничто. Некоторые языки, такие как PHP, при определенных обстоятельствах приравнивают значение 0 к нулю, false, пустую строку и т.д. Java и С# - строго типизированные языки. Поэтому ни одна из этих "полезных" неявных преобразований не имеет места. Таким образом, null является буквально нулевым или ничего. Нуль равен нулю. Никакое другое сравнение не вернется.