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

3

我的对象通常具有可为空类型的属性,这些属性用作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个回答

10

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

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

4

1) 短并不等于快。这一点很重要。

2) 这样也可以正常工作:

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

1

我喜欢对Randolpho和Marc的代码进行一些小的改写:

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

0

除非你的调用者要求使用 Nullable<T>,否则我建议使用这样的类型:

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

这将允许:

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

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


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

性能实际上不会有太大变化,但如果你真的想要优化,那么你需要考虑什么是最常见的,如果值几乎总是有效的整数,那么我的方法很可能是最好的选择,否则你的方法更好。


不要捕获异常。这会默默地掩盖可能发生的其他类型的异常。 - Andrew Keith
6
е‘ёпјҒж·»еҠ TryParse()еҮҪж•°жҳҜдёәдәҶйҳІжӯўзј–еҶҷиҝҷз§Қд»Јз ҒпјҢиҖҢдё”дҪҝз”ЁTryParseжҜ”жҚ•иҺ·жүҖжңүејӮеёёиҰҒеҘҪеҫ—еӨҡпјҒ - Robert Paulson
2
这篇帖子说我错了,即使没有失败,所以我的观点被接受! - Paul Creasey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接