哪些是首选的:可为空<>。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 == null
和SomeNullable.HasValue
将始终返回预期的true或false。 尽管下面没有演示, SomeNullable == 3
也是有效的(假设SomeNullable是一个int?
)。
虽然SomeNullable.Value
会让我们运行时错误,如果我们分配null
给SomeNullable
。 事实上,这是唯一一个空字符可能导致我们遇到问题的情况,这要归功于重载运算符,重载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?