Работа с обнуляемыми типами в C # - PullRequest
2 голосов
/ 28 января 2011

В моем классе определены свойства Nullable, которые участвуют в вычислениях и написании XML. Как вы все знаете, когда в вычислении участвует любое нулевое значение, результат всегда равен нулю. Я объясню это на примере ::

Код для свойств и расчета:

public decimal? Amount { get; set; }
public decimal? VatAmount { get; set; }
public decimal? InvoiceAmount { get; set; }
.
.
public decimal Add()
{
     //HERE I NEED 0 TO PERFORM THE CALCULATION
     this.InvoiceAmount = this.Amount + this.VatAmount;
     return this.InvoiceAmount
}
.
.
public string Insert()
{
     XDocument doc1 = XDocument.Load(@"Transactions.xml");
        var record = from r in doc1.Descendants("Transaction")
                     where (int)r.Element("Serial") == Serial
                     select r;
        foreach (XElement r in record)
        {
             //HERE I WANT NULL VALUES RETAINED  
             r.Element("DebitNote").Add(new XElement("InvoiceAmount", this.InvoiceAmount), new XElement("VatAmount", this.VatAmount), new XElement("Amount", this.Amount));
        }
        doc2.Save(@"Transactions.xml");
        return "Invoice Created Successfully";

Как вы можете видеть, пока значение Сумма или VatAmount не будет равно нулю, InvoiceAmount всегда будет равно нулю. Как я могу обойти это ?? Одним из возможных решений является установка значения по умолчанию для частной переменной Amount и VatAmount равным 0 . Но с этой настройкой, когда я добавляю запись в xml, значение для Amount и InvoiceAmount будет введено 0; тогда как я хочу сохранить ноль, если в этом случае ничего не введено.

Дайте мне знать, как могут быть выполнены оба условия. Не обязательно писать код, можете сказать мне в общем

Заранее спасибо !!

Ответы [ 4 ]

6 голосов
/ 28 января 2011

Как насчет использования GetValueOrDefault метода Nullable<T> в расчете?Таким образом, вы получите нули для своих расчетов, но сохраните нули для своего XML.

this.InvoiceAmount = this.Amount.GetValueOrDefault() 
                   + this.VatAmount.GetValueOrDefault(); 
6 голосов
/ 28 января 2011

Вы можете написать Amount ?? 0.
В этом коде используется нуль-объединяющий оператор , который оценивает свой первый ненулевой операнд.

Таким образом, Amount ?? 0 будетоцените значение Amount, если оно не равно нулю, и 0, если оно равно нулю.

1 голос
/ 28 января 2011

Я думаю, что вам нужно будет проверить наличие нуля в методе добавления и трактовать его как ноль.

например:

//HERE I NEED 0 TO PERFORM THE CALCULATION
 this.InvoiceAmount = this.Amount ?? decimal.Zero + this.VatAmount ?? decimal.Zero;
 return this.InvoiceAmount
1 голос
/ 28 января 2011
if (this.Amount.HasValue) 
    this.InvoiceAmount += this.Amount;
if (this.VatAmount.HasValue) 
    this.InvoiceAmount += this.VatAmount;
...