我只是对人们的意见感兴趣。在使用C#中的可空类型时,测试null的最佳实践方法是什么:
bool isNull = (i == null);
或者
bool isNull = !i.HasValue;
同时,当对非空类型进行赋值时,情况如下:
long? i = 1;
long j = (long)i;
比之更好的:
long? i = 1;
long j = i.Value;
我会使用这个:
long? i = 1;
...some code...
long j = i ?? 0;
这意味着,如果i是null,那么将被赋值为0。
使用由C#团队专门为您实现的表单。如果有人反对,请告诉他们Anders说这是可以的。
我的意思是,为了给您带来良好的编程体验,在将可空类型集成到C#中进行了许多工作。
请注意,就性能而言,这两种形式都会编译成相同的IL代码,也就是:
int? i = 1;
bool isINull = i == null;
int j = (int)i;
int? i = 1;
bool isINull = !i.HasValue;
int j = i.Value;
我在实践中没有使用过可空类型,但是对于第二个问题,我建议使用j.GetValueOrDefault()。文档表明,如果值为null,则后者实际上会抛出InvalidOperationException异常。根据long?的显式转换运算符的内部实现,前者也可能会抛出异常。我建议使用GetValueOrDefault并适当处理null/默认情况。
我倾向于在两者中都使用第一个,因为随着它在生命周期后期需要得到支持,这些似乎更容易理解原始作者的意图。
打开了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;
}
}
它们是一样的,但我会在两种情况下使用前者版本,因为它在语言中更常见:与 null 的比较和类型转换。