哪些是首选的:可为空<>。HasValue或Nullable <>!= null?

我总是使用(a) Nullable<>.HasValue因为我喜欢语义。 但是,最近我正在使用其他人现有的代码库(b)仅使用Nullable<> != null 。 是有理由相互使用一个,还是纯粹偏好?

(一个)

int? a;
if (a.HasValue)
    ...

(b)中

int? b;
if (b != null)
    ...

编译器用一个HasValue调用代替空比较,所以没有真正的区别。 只要做到可读性更高或对您和您的同事更有意义。


我更喜欢(a != null)以便语法与引用类型相匹配。


我通过使用不同的方法将值赋给一个可为空的int做了一些研究。 当我做了各种各样的事情时,发生了什么。 应该澄清发生了什么事。 请记住: Nullable<something>或简写的something? 是一个结构,编译器似乎在做很多工作让我们使用null,就像它是一个类一样。
正如您在下面看到的, SomeNullable == nullSomeNullable.HasValue将始终返回预期的true或false。 尽管下面没有演示, SomeNullable == 3也是有效的(假设SomeNullable是一个int? )。
虽然SomeNullable.Value会让我们运行时错误,如果我们分配nullSomeNullable 。 事实上,这是唯一一个空字符可能导致我们遇到问题的情况,这要归功于重载运算符,重载object.Equals(obj)方法以及编译器优化和猴子业务的组合。

以下是我运行的一些代码的描述,以及它在标签中生成的输出:

int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

好的,让我们尝试下一个初始化方法:

int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

和以前一样。 请记住用int? val = new int?(null);初始化int? val = new int?(null); int? val = new int?(null); ,将null传递给构造函数,会产生一个COMPILE时间错误,因为可空对象的VALUE不可为空。 只有包装对象本身可以等于null。

同样,我们将得到一个编译时错误:

int? val = new int?();
val.Value = null;

更不用说val.Value都是只读属性,这意味着我们甚至不能使用类似如下的东西:

val.Value = 3;

但同样,多态重载隐式转换运算符让我们做到:

val = 3;

无需担心polysomthing什么chamacallits虽然,只要它的工作正确? :)

链接地址: http://www.djcxy.com/p/30407.html

上一篇: Which is preferred: Nullable<>.HasValue or Nullable<> != null?

下一篇: Dictionary ForAll / ForEach method