я очень люблю Визуальная Парадигма для UML, Это очень мощно и имеет свободное Выпуск Сообщества и дешевый Personal Edition также.
http://content.usa.visual-paradigm.com/websiteimages/images/products/ag10/agtitle.gif Agilian
Для Гибкого моделирования существует также Agilian, который немного более гибок, добавляет дополнительные опции для поддержки smartboards и знает схему выражения идей также.
вещь мне нравится больше всего об их продуктах, гибкость. Я использую Архитектора Предприятия на работе в наше время, но я думаю, что это не достаточно умно. Я хочу быть в состоянии к быстрому мозговому штурму, некоторые диаграммы последовательности и иметь приложение совершенствуют мою модель в фоновом режиме, что-то, в чем VPUML делает очень хорошее задание.
, По-моему, это - путь лучше, чем Архитектор Предприятия, хотя это - большой инструмент также:)
Различные причины:
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
должен проверить:
==
для GetValueOrDefault ()
каждого лота накладных расходов ....
Да, есть штраф. Структура Nullable
содержит значение, а также логический флаг, который определяет отсутствие значения NULL.
Хотя логическое значение составляет только один байт, структуры выравниваются по четным границам слова. int
использует четыре байта памяти, а int?
требует восьми байтов.
Какие типы значений действительно допускают значение NULL? Я ничего не знаю.
РЕДАКТИРОВАТЬ: Если вы ссылаетесь на строковый тип, то это не тип значения, а ссылочный тип.
В дополнение к ответу Марка Гравелла проверьте отраженный код из 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
и то, как свойства его используют.
Рассмотрим реализацию. Целое число в C # определяется как
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>
. Структура хранится непосредственно в стеке, в отличие от ссылок на объекты, которые являются указателями на память (сама ссылка находится в стеке, но выделение - в стеке).
Ссылка NULL просто означает, что указатель в стеке не был инициализирован местоположением в куче.