在C#中使用可空类型

时间:2008-11-03 18:19:07

标签: c# nullable

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

bool isNull = (i == null);

bool isNull = !i.HasValue;

同样,当分配给非null类型时:

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

优于:

long? i = 1;
long j = i.Value;

8 个答案:

答案 0 :(得分:15)

我会用这个:

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

这意味着,如果 i null ,则会分配0。

答案 1 :(得分:12)

使用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;

答案 2 :(得分:8)

我总是使用(i == null)表单。它表达了你在做什么。

WRT第二个问题,我认为两种形式都没问题。但是我总是首先检查它是否为null并采取适当的操作 - 可能在辅助方法中包装该检查和操作(通常它只是设置一个默认值)。

答案 3 :(得分:4)

我没有在实践中使用Nullable Types,但是对于第二种,我实际上建议使用j.GetValueOrDefault()。文档表明后者实际上会在null值的情况下抛出InvalidOperationException。取决于explict强制转换操作符的内部实现,前者可能也是如此。我坚持使用GetValueOrDefault并适当地处理null / default情况。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

public Nullable(T value)
{
    this.value = value;
    this.hasValue = true;
}

private bool hasValue;

internal T value;

public bool HasValue
{
    get
    {
        return this.hasValue;
    }
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我通常倾向于倾向于两个场景中的第一个选项,因为它更倾向于面向对象的“原始”(这真的是我们想要的),但它确实无关紧要

相关问题