如何更好地从非可空类型初始化可空类型?

时间:2009-12-14 22:38:56

标签: c# .net nullable

我的对象通常具有可用作SQL命令参数的可空类型属性。

我接下来初始化它们:

public int? Amount
{
    get
    {
        int i;
        int? amount = null;
        if (Int32.TryParse(Request["amount"], out i))
        {
            amount = i;
        }
        return amount;
    }
}

command.Parameters.Add("@amount").Value = (object)this.Amount ?? DbNull.Value;

如何重写这些初始化代码以缩短或更快

5 个答案:

答案 0 :(得分:8)

首先,不要这样做;你正默默地放弃你无法解析数据的事实!最好在这种情况下抛出异常,或处理预期方案(例如null)。

string val = Request["amount"];
return string.IsNullOrEmpty(val) ? (int?)null : (int?)int.Parse(val);

答案 1 :(得分:3)

1)更短!=更快。重要的是要注意。

2)这也会起作用:

public int? Amount
{
    get
    {
        int i;
        if (Int32.TryParse(Request["amount"], out i))
        {
            return i;
        }
        return null;
    }
}

答案 2 :(得分:0)

我喜欢稍微改写一下Randolpho和Marc的代码:

return Int32.TryParse(Request["amount"], out i)) ? (int?)i : (int?)null;

答案 3 :(得分:0)

除非您的来电者要求Nullable<T>,否则我建议您使用以下类型:

struct MaybeValid<T>
{
    public bool IsValid;
    public T Value;
}

这将允许:

Public MaybeValid<int> Amount
{
    Amount.Value = Int32.TryParse(out Amount.IsValid);
}

使用Int32,额外的类型转换工作可能不是太大的问题,但对于更大的类型,它可能更重要。

答案 4 :(得分:-5)

public int? Amount
{
    get
    {
         try 
         {
               return Int.Parse(Request["amount"]);
         }
          catch (exception e) 
         { 
               return null;
         }
     }
{

性能并没有真正改变,但如果你真的想要优化,那么你需要考虑什么是最常见的,如果值几乎总是有效的整数,那么我的方法可能是最好的,如果不是那么你的方法是最好的。