9

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

bool isNull = (i == null);

或者

bool isNull = !i.HasValue;

此外,当分配给非空类型时:

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

优于:

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

8 回答 8

15

我会用这个:

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

这意味着,如果inull,则将分配比 0 。

于 2008-11-03T18:23:49.403 回答
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;
于 2008-11-03T19:09:58.093 回答
8

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

WRT第二个问题,我认为任何一种形式都可以。但是,我总是先检查它是否为 null 并采取适当的措施——也许将检查和操作包装在一个辅助方法中(通常它只是设置一个默认值)。

于 2008-11-03T18:22:07.410 回答
4

在实践中我没有使用过 Nullable Types,但是对于第二个,我实际上建议使用 j.GetValueOrDefault()。文档表明后者实际上会在出现空值时抛出 InvalidOperationException。根据显式转换运算符的内部实现 long? ,前者也可能。我会坚持使用 GetValueOrDefault 并适当地处理 null/default 情况。

于 2008-11-03T18:25:35.077 回答
1

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

于 2008-11-03T19:46:41.123 回答
1

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

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

private bool hasValue;

internal T value;

public bool HasValue
{
    get
    {
        return this.hasValue;
    }
}
于 2008-11-03T20:08:51.390 回答
0

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

于 2008-11-03T18:22:47.893 回答
0

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

于 2008-11-03T18:23:15.690 回答