Как null представлен в .NET - PullRequest
       15

Как null представлен в .NET

5 голосов
/ 30 декабря 2008

У меня был разговор с сотрудником, и тема о нуле поднялась. Он говорил мне, что в .NET за кулисами это просто очень мало. Я всегда думал, что у объекта просто нет указателя на какую-либо память в куче, но я не был уверен в любом случае.

Так что я надеюсь, что сообщество сможет прояснить это для нас; P

Ответы [ 4 ]

16 голосов
/ 30 декабря 2008

Это 0.

Снип от ldnull в спецификации ECMA-335:

Можно подумать, что избыточно: почему бы не использовать ldc.i4.0 или вместо ldc.i8.0? Ответ в том, что ldnull обеспечивает независимый от размера ноль - аналогично инструкции ldc.i, который не существует. Однако, даже если CIL должны были включать ldc.i инструкция это все равно будет полезно алгоритмы проверки, чтобы сохранить ldnull инструкция, потому что это делает Отслеживание типов проще.

5 голосов
/ 30 декабря 2008

Если для экземпляра типа Nullable задано значение NULL, его базовое значение равно нулю.

Точнее говоря, обнуляемый тип - это структура, которая объединяет значение базового типа вместе с логическим нулевым индикатором. Экземпляр типа Nullable имеет два общедоступных свойства только для чтения: HasValue типа bool и Value базового типа типа NULL.

HasValue имеет значение true для ненулевого экземпляра и false для нулевого экземпляра.

Таким образом, когда HasValue имеет значение true, свойство Value возвращает содержащееся значение. Когда HasValue имеет значение false, попытка доступа к свойству Value вызывает исключение. Но если бы вы могли получить к нему доступ, вы бы обнаружили, что он содержит ноль.

0 голосов
/ 30 декабря 2008

С MSDN :

Ключевое слово null - это литерал, который представляет собой нулевую ссылку, которая не относится ни к какому объекту

Чтобы попытаться сделать его более понятным в старых версиях c #, тип значения не может быть нулевым, т. Е. Он ДОЛЖЕН иметь значение, если вы его не присваивали, вы получили потенциально случайное значение так что-то вроде:

int i;
i++;
console.writeline(i);

в более старых версиях c # объекты должны были быть инициализированы, иначе они были бы нулевыми, что означало, что они не имели ссылки на какой-либо объект.

Теперь с типами значений NULL в c # 2.0+ вы можете иметь значение NULL, что означает, что если у вас есть этот код:

int? i;
i++;
console.writeline(i);

на самом деле вы получите исключение на i ++, потому что я никогда не инициализировался ни для чего, кроме null. Если ноль был 0, этот код работал бы нормально, потому что он просто оценил бы к 0 + 1, однако это неправильное поведение.

Если null всегда был 0, и у вас был обнуляемый int, и вы написали некоторый код вроде:

int? i;
if (int == 0)
{
//do something
}

существует очень реальная возможность того, что вы можете получить неожиданное поведение, если значение null было таким же, как 0, потому что компилятор никак не мог бы различить int, равное null, и int, явно заданное равным 0.

Еще один пример, который проясняет мои мысли:

public int? AddNumbers(int? x, int? y)
{
    if (x == null || y == null)
        return null;
    if (x == 0)
        return y;
    if (y == 0)
        return x;

    return x + y;
}

в этом примере ясно, что null и 0 очень разные, потому что если вы передадите 0 для x или y, а null будет равен 0, то приведенный выше код никогда не попадет в проверки для x == 0 или y == 0, однако, если вы запустите код и передадите 0 для x или y, проверки будут выполнены.

0 голосов
/ 30 декабря 2008

из моего опыта, я верю Nothing будет работать, и так будет DBNull.Value

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...