Какова причина не, все типы значения nullable?

Визуальная Парадигма для http://content.usa.visual-paradigm.com/websiteimages/images/products/vpuml60/vpumltitle.gif UML

я очень люблю Визуальная Парадигма для UML, Это очень мощно и имеет свободное Выпуск Сообщества и дешевый Personal Edition также.

http://content.usa.visual-paradigm.com/websiteimages/images/products/ag10/agtitle.gif Agilian

Для Гибкого моделирования существует также Agilian, который немного более гибок, добавляет дополнительные опции для поддержки smartboards и знает схему выражения идей также.

вещь мне нравится больше всего об их продуктах, гибкость. Я использую Архитектора Предприятия на работе в наше время, но я думаю, что это не достаточно умно. Я хочу быть в состоянии к быстрому мозговому штурму, некоторые диаграммы последовательности и иметь приложение совершенствуют мою модель в фоновом режиме, что-то, в чем VPUML делает очень хорошее задание.

, По-моему, это - путь лучше, чем Архитектор Предприятия, хотя это - большой инструмент также:)

11
задан abatishchev 1 September 2010 в 10:34
поделиться

5 ответов

Различные причины:

  • История: Nullable не существовало до .NET 2.0, и он не может нарушить существующий код, особенно с другим правила бокса для Nullable
  • Значение: если я хочу int , я, возможно, не хочу, чтобы он допускал значение NULL ... Я хочу, чтобы он был int , и я не хочу, чтобы мне приходилось проверять / обрабатывать нули
  • Пробел: он добавляет дополнительную стоимость к каждой структуре ... в частности, представьте себе byte [] , а теперь рассмотрим, допускал ли байт значение NULL - много дополнительных служебных данных; * плюс это остановит вас от выполнения блитов и т.д. *
  • Производительность: Nullable добавляет множество дополнительных штрафов; в частности, множество скрытых вызовов .HasValue и . Значение / .GetValueOrDefault () ; это показано, в частности, в «расширенных операторах» - то есть x + y становится чем-то вроде ниже, что складывается для плотных циклов и т. д .:

    (x.HasValue && y.HasValue)? (x.GetValueOrDefault () + y.GetValueOrDefault ()): null

Аналогично, x == y должен проверить:

  • если оба null => true
  • если один null = > false
  • в противном случае используйте == для GetValueOrDefault () каждого

лота накладных расходов ....

20
ответ дан 3 December 2019 в 03:36
поделиться

Да, есть штраф. Структура Nullable содержит значение, а также логический флаг, который определяет отсутствие значения NULL.

Хотя логическое значение составляет только один байт, структуры выравниваются по четным границам слова. int использует четыре байта памяти, а int? требует восьми байтов.

6
ответ дан 3 December 2019 в 03:36
поделиться

Какие типы значений действительно допускают значение NULL? Я ничего не знаю.

РЕДАКТИРОВАТЬ: Если вы ссылаетесь на строковый тип, то это не тип значения, а ссылочный тип.

1
ответ дан 3 December 2019 в 03:36
поделиться

В дополнение к ответу Марка Гравелла проверьте отраженный код из Nullable :

public struct Nullable<T> where T: struct
{
    private bool hasValue;

    internal T value;

    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }

    public bool HasValue
    {
        get
        {
            return this.hasValue;
        }
    }
    public T Value
    {
        get
        {
            if (!this.HasValue)
            {
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
            }
            return this.value;
        }
    }
    public T GetValueOrDefault()
    {
        return this.value;
    }

    public T GetValueOrDefault(T defaultValue)
    {
        if (!this.HasValue)
        {
            return defaultValue;
        }
        return this.value;
    }

    public override bool Equals(object other)
    {
        if (!this.HasValue)
        {
            return (other == null);
        }
        if (other == null)
        {
            return false;
        }
        return this.value.Equals(other);
    }

    public override int GetHashCode()
    {
        if (!this.HasValue)
        {
            return 0;
        }
        return this.value.GetHashCode();
    }

    public override string ToString()
    {
        if (!this.HasValue)
        {
            return "";
        }
        return this.value.ToString();
    }

    public static implicit operator T?(T value)
    {
        return new T?(value);
    }

    public static explicit operator T(T? value)
    {
        return value.Value;
    }
}

Вы Обратите внимание на существование логического HasValue и то, как свойства его используют.

0
ответ дан 3 December 2019 в 03:36
поделиться

Рассмотрим реализацию. Целое число в C # определяется как

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>

. Структура хранится непосредственно в стеке, в отличие от ссылок на объекты, которые являются указателями на память (сама ссылка находится в стеке, но выделение - в стеке).

Ссылка NULL просто означает, что указатель в стеке не был инициализирован местоположением в куче.

0
ответ дан 3 December 2019 в 03:36
поделиться
Другие вопросы по тегам:

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