代码之家  ›  专栏  ›  技术社区  ›  Martin Brown

在C中使用可以为null的类型#

  •  9
  • Martin Brown  · 技术社区  · 16 年前

    我只是对人们的意见感兴趣。在C#中使用可以为null的类型时,测试null的最佳实践方法是什么:

    bool isNull = (i == null);
    

    bool isNull = !i.HasValue;
    

    当分配给非空类型时,也是这样:

    long? i = 1;
    long j = (long)i;
    

    比:

    long? i = 1;
    long j = i.Value;
    
    8 回复  |  直到 15 年前
        1
  •  15
  •   Seiti    16 年前

    我会用这个:

    long? i = 1;
    ...some code...
    long j = i ?? 0;
    

    这意味着,如果 无效的 ,将分配0。

        2
  •  12
  •   mackenir    16 年前

    使用C#团队专门为您实现的表单。如果有人反对,告诉他们安德斯说没关系。

    我轻率地说,为了给你一个良好的编程体验,在将可空类型集成到c#中做了很多工作。

    请注意,就性能而言,这两种形式都编译为相同的IL,即:

    int? i = 1;
    bool isINull = i == null;
    int j = (int)i;
    

    C#编译器处理后,结果如下:

    int? i = 1;
    bool isINull = !i.HasValue;
    int j = i.Value;
    
        3
  •  8
  •   philsquared    16 年前

    我总是使用(I==null)形式。它表示你正在做什么。

    回答第二个问题,我认为两种形式都可以。然而,我总是先检查null并采取适当的行动——也许把检查和行动包装在一个辅助方法中(通常它只是设置一个默认值)。

        4
  •  4
  •   Marc Bollinger    16 年前

    我在实践中没有使用过Nullable Types,但对于第二种类型,我实际上建议使用j.GetValueOrDefault()。文档表明,如果值为空,后者实际上会抛出InvalidOperationException。取决于explicit cast操作符的内部实现时间长吗?前者也可能。我会坚持使用GetValueOrDefault,并适当地处理空/默认情况。

        5
  •  1
  •   Fry    16 年前

    我倾向于在两者上都使用第一个,因为它需要在生命周期的后期得到支持,这些似乎更容易理解原作者的意图。

        6
  •  1
  •   AdamSane    16 年前

    打开反射器。HasValue是对布尔标志的查找,该标志在值更改时设置。因此,就周期而言,查找比比较更快。

    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }
    
    private bool hasValue;
    
    internal T value;
    
    public bool HasValue
    {
        get
        {
            return this.hasValue;
        }
    }
    
        7
  •  0
  •   Omer van Kloeten    16 年前

    它们都是一样的,但我会在两者上使用前一个版本,因为它在语言中更常见:与null进行比较并转换为类型。

        8
  •  0
  •   John    16 年前

    在这两种情况下,我通常倾向于选择第一种,因为它更“原始”,而不是面向对象(这正是我们想要的),但这真的没那么重要