Как пустой указатель представлен в.NET

Найдите http:// в строке, затем посмотрите вперед и назад на пробел:

int pos = str.indexOf("http://");
if (pos >= 0) {
  // Look backwards for space.
  int start = Math.max(0, str.lastIndexOf(' ', pos));

  // Look forwards for space.
  int end = str.indexOf(' ', pos + "http://".length());
  if (end < 0) end = str.length();

  return str.substring(start, end);
}
5
задан Alex 29 December 2008 в 22:47
поделиться

4 ответа

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

Чтобы быть точнее, nullable тип является структурой, которая комбинирует значение базового типа вместе с булевым нуль-индикатором. Экземпляр nullable типа имеет два общедоступных свойства только для чтения: HasValue типа bool и Значение базового типа nullable типа.

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

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

5
ответ дан 18 December 2019 в 08:32
поделиться

Это 0.

Надрез от ldnull в спецификации ECMA-335:

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

16
ответ дан 18 December 2019 в 08:32
поделиться

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

0
ответ дан 18 December 2019 в 08:32
поделиться

Из MSDN:

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

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

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

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

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

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

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

Если пустой указатель всегда был 0, и у Вас был nullable интервал, и Вы написали некоторый код как:

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

существует очень реальная возможность, Вы могли получить некоторое неожиданное поведение, ЕСЛИ БЫ пустой указатель совпал с 0, потому что нет никакого способа, которым компилятор мог дифференцироваться между интервалом, являющимся пустым и интервалом, явно устанавливаемым на 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;
}

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

-2
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: