Есть несколько значений для null
.
Один из языков программирования, который представляет переменные и память на основе указателей (который включает ссылки на C #, хотя он скрывает некоторые детали), - это «ни на что не указывает».
Другое - «это не имеет никакого значимого значения».
В ссылочных типах мы часто используем первые для представления последних. Мы могли бы использовать string label = null
для обозначения «нет значащего ярлыка». Однако остается, что он все еще также - вопрос того, что происходит с точки зрения того, что находится в памяти и что указывает на это. Тем не менее, это довольно чертовски полезно, какой позор, мы не могли сделать это с int
и DateTime
в C # 1.1
Это то, что предоставляет Nullable<T>
, средство, чтобы сказать "нет значащего значения", но на уровне ниже это не null
таким же образом, как строка null
(если не заключено в коробку). Ей присвоено значение NULL и равно NULL, поэтому он логически равен NULL и NULL в соответствии с какой-либо другой семантикой, но он не равен NULL в разнице реализации «не указывает ни на что» между ссылочными типами и типами значений.
Только аспект "ничто не указывает" на ссылочный тип null не позволяет вам вызывать методы экземпляра для него.
И на самом деле, даже это не совсем верно. IL, давайте будем вызывать методы экземпляра по нулевой ссылке, и пока он не взаимодействует с какими-либо полями, он будет работать. Он не может работать, если ему нужны (прямо или косвенно) эти поля, поскольку они не существуют по нулевой ссылке, но он может вызвать null.FineWithNull()
, если этот метод был определен как:
int FineWithNull()
{
//note that we don't actually do anything relating to the state of this object.
return 43;
}
С C # было решено запретить это, но это не правило для всех .NET (я думаю, что F # позволяет это, но я не уверен, я знаю, что неуправляемый C ++ позволял это, и это было полезно в некоторых очень редких случаях ).