C# Автоматические Свойства - Все еще пустой после + =?

Предположение, что Тест является классом с определенным конструктором, нет никакого различия. Последняя форма делает это немного более ясным, что конструктор Test работает, но это об этом.

9
задан Sam Schutte 26 August 2009 в 15:04
поделиться

10 ответов

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 ,

31
ответ дан 4 December 2019 в 06:02
поделиться
Null + 8 = Null

You'll need to set it with zero before.

7
ответ дан 4 December 2019 в 06:02
поделиться

null means unknown value,

unknown value + known value = still unknown value
5
ответ дан 4 December 2019 в 06:02
поделиться

Вот однострочник для его инициализации при первом вызове и последующего увеличения:

    public void InitializeOrIncrement(decimal value)
    {
        // if Total is null then initialize, otherwise increment
        Total = (Total == null) ? value : Total + value;
    }

    public decimal? Total { get; set; }
3
ответ дан 4 December 2019 в 06:02
поделиться

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.

2
ответ дан 4 December 2019 в 06:02
поделиться

Я знаю, что есть смысл сделать

public decimal? Total { get; set; }

Total = (Total ?? 0) + 8;

, но разве это не было бы проще сделать:

public decimal Total { get; set; }

начальное значение Total равно 0

1
ответ дан 4 December 2019 в 06:02
поделиться

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.
0
ответ дан 4 December 2019 в 06:02
поделиться

Нуль не то же самое, что ноль. Ноль плюс восемь - это восемь ... но ноль плюс восемь? Всегда ноль. Точно так же, как бесконечность плюс все равно есть бесконечность - она ​​не определена.

Вы обнаружите, что это универсально верно для нуля. Каждая база данных (по крайней мере, с которой я когда-либо работал) даст один и тот же результат.

0
ответ дан 4 December 2019 в 06:02
поделиться

общедоступная десятичная дробь? Всего {получить; установлен; }

Хотели бы что-нибудь поработать? Какая-то автоматическая инициализация, если значение еще не установлено.

public decimal? Total
{
  get { return this.totalValue;}
  set
  { 
     if(totalValue == null) { this.totalValue = 0;}
     this.totalValue = value;
  }
}

private decimal? totalValue;
0
ответ дан 4 December 2019 в 06:02
поделиться

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

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

1
ответ дан 4 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

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