【问题标题】:How to better initialize nullable type from non-nullable?如何更好地从非可空类型初始化可空类型?
【发布时间】:2009-12-14 22:38:55
【问题描述】:

我的对象通常具有用作 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;

我怎样才能重写这样的初始化代码以使其更短或更快

【问题讨论】:

    标签: c# .net nullable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      1) 更短!= 更快。需要注意的重要事项。

      2) 这同样适用:

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

      【讨论】:

        【解决方案3】:

        我喜欢稍微重写 Randolpho 和 Marc 的代码:

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

        【讨论】:

          【解决方案4】:

          除非你的调用者需要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;
                     }
                 }
            {
            

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

            【讨论】:

            • 不要捕获异常。它默默地掩盖了可能发生的其他类型的异常。
            • 糟糕!添加TryParse() 是为了防止编写此类代码,并且使用 TryParse 比吞下所有异常要好得多!
            • stackoverflow.com/questions/150114/… 这个帖子说我错了,即使没有失败,所以点!
            猜你喜欢
            • 1970-01-01
            • 2010-10-21
            • 2021-02-17
            • 2020-12-19
            • 1970-01-01
            • 2019-01-28
            • 2022-01-22
            相关资源
            最近更新 更多