Что такое 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 (Руководство по программированию на С#).
Ответ 5
Это null в С#
Ответ 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 является буквально нулевым или ничего. Нуль равен нулю. Никакое другое сравнение не вернется.