Предположение, что Тест является классом с определенным конструктором, нет никакого различия. Последняя форма делает это немного более ясным, что конструктор Test работает, но это об этом.
public decimal? Total { get; set; }
Думайте о null
как о «неизвестное значение». Если у вас есть неизвестное количество чего-либо и вы добавляете еще 8, сколько у вас сейчас?
Ответ: неизвестно.
Операции с нулевыми переменными
Там есть случаев, когда операции с неизвестными значениями дают вам узнаваемые результаты.
public bool? State { get; set; }
Следующие утверждения имеют известные решения, даже если они содержат неизвестно ] values:
State = null;
nextState = State & false; // always equals false
nextState = State & true; // still unknown (null)
nextState = State | true; // always true
nextState = State | false; // still unknown (null)
Видите шаблон?
Конечно, если вы хотите, чтобы Total
было эквивалентно (равно) 0, когда оно null
,
Null + 8 = Null
You'll need to set it with zero before.
null
means unknown value,
unknown value + known value = still unknown value
Вот однострочник для его инициализации при первом вызове и последующего увеличения:
public void InitializeOrIncrement(decimal value)
{
// if Total is null then initialize, otherwise increment
Total = (Total == null) ? value : Total + value;
}
public decimal? Total { get; set; }
From MSDN:
When you perform comparisons with nullable types, if the value of one of the nullable types is null and the other is not, all comparisons evaluate to false except for != (not equal). It is important not to assume that because a particular comparison returns false, the opposite case returns true.
So, it works as intended.
Я знаю, что есть смысл сделать
public decimal? Total { get; set; }
Total = (Total ?? 0) + 8;
, но разве это не было бы проще сделать:
public decimal Total { get; set; }
начальное значение Total равно 0
to set the value of the Total is just
Total = 8;
I would recommend reading up on Nullable Types to understand how they work. You can check to see if the property has a value by using HasValue
.
From MSDN:
Operators
The predefined unary and binary operators and any user-defined operators that exist for value types may also be used by nullable types. These operators produce a null value if the operands are null; otherwise, the operator uses the contained value to calculate the result. For example:
int? a = 10;
int? b = null;
a++; // Increment by 1, now a is 11.
a = a * 10; // Multiply by 10, now a is 110.
a = a + b; // Add b, now a is null.
Нуль не то же самое, что ноль. Ноль плюс восемь - это восемь ... но ноль плюс восемь? Всегда ноль. Точно так же, как бесконечность плюс все равно есть бесконечность - она не определена.
Вы обнаружите, что это универсально верно для нуля. Каждая база данных (по крайней мере, с которой я когда-либо работал) даст один и тот же результат.
общедоступная десятичная дробь? Всего {получить; установлен; }
Хотели бы что-нибудь поработать? Какая-то автоматическая инициализация, если значение еще не установлено.
public decimal? Total
{
get { return this.totalValue;}
set
{
if(totalValue == null) { this.totalValue = 0;}
this.totalValue = value;
}
}
private decimal? totalValue;
Как отмечали другие люди, null не равно нулю. Хотя может показаться более удобным, что целое число null по умолчанию равно нулю, в долгосрочной перспективе это может привести к странным результатам, которые вы можете не заметить, пока не станет слишком поздно.
В качестве небольшого примера, допустим, один из ваших каналов данных не работает и заполняет ваш набор результатов нулями. Ваши вычисления будут рассматривать нули как нули и продолжать выдавать результаты. Поскольку числа продолжают выводиться, даже если они, скорее всего, неверны, вы можете и не заметить, что что-то пошло не так.