Что является пустым в c#, Java?

Как... это 0 как в C++? Или это - некоторый "специальный" объект? Или возможно что-то полностью различное?

- РЕДАКТИРОВАНИЕ-

Я действительно знаю, каково это, вопрос скорее - как это сделано

14
задан argh 8 January 2010 в 15:05
поделиться

9 ответов

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

0
ответ дан 1 December 2019 в 07:19
поделиться

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

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

7
ответ дан 1 December 2019 в 07:19
поделиться

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

Что имеет значение в поведение NULL, как определено в языковой спецификации (см. Ответы Дэна и МРФРОЦИС. По сути, это особое значение, которое может удерживать переменные ссылочного типа, а какие нельзя развить.

Кстати, в качестве контрольной точки Serialization Serialization используют одно байтовое значение 0x70, чтобы представлять нулевую ссылку.

9
ответ дан 1 December 2019 в 07:19
поделиться

От Microsoft MDSN:

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

2
ответ дан 1 December 2019 в 07:19
поделиться

Моя версия с использованием drop:

every n xs = case drop (n-1) xs of
              (y:ys) -> y : every n ys
              [] -> []

Edit: это также работает для конечных списков. Только для бесконечных списков решение Чарльза Стюарта немного короче.

-121--1309850-

Это значение null в C #

-121--2440552-

null является «ссылкой» на ничто, поэтому указывает буквально на ничто.

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

0
ответ дан 1 December 2019 в 07:19
поделиться

Так как Вы спрашиваете о деталях реализации, а не о семантике, то ответ специфичен для данной реализации.

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

Реализация C# на CLR представляет собой нулевую ссылку на нулевые биты. (Где количество битов соответствует размеру управляемого указателя на конкретной версии запускаемого CLR.)

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

Тип null nullable value type также реализуется нулями, хотя и по-другому. Когда вы говорите

int? j = null;

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

struct NullableInt 
{
    int value;
    bool hasValue;
}

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

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

17
ответ дан 1 December 2019 в 07:19
поделиться
1
ответ дан 1 December 2019 в 07:19
поделиться

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

#define NULL (void*)0

в C ++. Так что в основном да, это ноль.

Редактировать: Поскольку я, очевидно, не словил этот ответ в любом месте рядом правильно ...

Что я имел в виду, так это:

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

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

        Console.ReadKey();
    }

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

0
ответ дан 1 December 2019 в 07:19
поделиться

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

1
ответ дан 1 December 2019 в 07:19
поделиться