在C#中使用Nullable类型

时间:2011-01-28 13:57:28

标签: c# wpf nullable

我在我的类中定义了Nullable属性,它们参与计算和xml编写。众所周知,当任何空值参与计算时,结果始终为null。我将通过examle ::

解释

属性和计算代码:

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 将始终为null。我该如何解决这个问题?一种可能的解决方案是将金额 VatAmount 的私有变量的默认值设置为 0 。但是当我将记录添加到xml时,使用此设置,金额 InvoiceAmount 的值将输入0;如果在这种情况下没有输入,我想保留null。

让我知道如何满足这两个条件。 不一定需要编写代码,一般可以告诉我

提前致谢!!

4 个答案:

答案 0 :(得分:6)

你可以写Amount ?? 0 此代码使用null-coalescing operator,它计算其第一个非空操作数。

因此,如果Amount ?? 0为空,则Amount将评估为0,如果为空,则{{1}}将评估为{{1}}。

答案 1 :(得分:6)

如何在计算中使用GetValueOrDefault Nullable<T>方法?这样,您将获得计算的零,但保留xml的空值。

this.InvoiceAmount = this.Amount.GetValueOrDefault() 
                   + this.VatAmount.GetValueOrDefault(); 

答案 2 :(得分:1)

if (this.Amount.HasValue) 
    this.InvoiceAmount += this.Amount;
if (this.VatAmount.HasValue) 
    this.InvoiceAmount += this.VatAmount;

答案 3 :(得分:1)

我认为你必须在add方法中检查null并将其视为零。

例如:

//HERE I NEED 0 TO PERFORM THE CALCULATION
 this.InvoiceAmount = this.Amount ?? decimal.Zero + this.VatAmount ?? decimal.Zero;
 return this.InvoiceAmount