我总是使用(a)Nullable<>.HasValue
因为我喜欢语义.然而,最近我正在研究其他人现有的代码库,他们Nullable<> != null
专门使用(b)代替.是否有理由使用一个而不是另一个,还是纯粹的偏好?
(一个)
int? a; if (a.HasValue) // ...
(b)中
int? b; if (b != null) // ...
Rex M.. 440
编译器将null比较替换为调用HasValue
,因此没有真正的区别.只要做一个对您和您的同事更具可读性/更有意义的事情.
编译器将null比较替换为调用HasValue
,因此没有真正的区别.只要做一个对您和您的同事更具可读性/更有意义的事情.
我更喜欢(a != null)
语法匹配引用类型.
我通过使用不同的方法将值赋给可空int来对此进行了一些研究.这是我做各种事情时发生的事情.应该澄清发生了什么.请记住:Nullable
或者简写something?
是一个结构,编译器似乎正在做很多工作,让我们使用null,就像它是一个类一样.
正如您将在下面看到的那样,SomeNullable == null
并且SomeNullable.HasValue
将始终返回预期的真或假.虽然下面没有说明,但SomeNullable == 3
也是有效的(假设SomeNullable是一个int?
).
虽然SomeNullable.Value
得到了我们一个运行时错误,如果我们分配null
给SomeNullable
.事实上,这是唯一一个由于重载运算符,重载object.Equals(obj)
方法,编译器优化和猴子业务的组合,nullables可能导致我们出现问题的情况.
以下是我运行的一些代码的说明,以及它在标签中生成的输出:
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);
,使用null传递给构造函数初始化会产生COMPILE时间错误,因为可空对象的VALUE不可为空.只有包装器对象本身才能等于null.
同样,我们会得到一个编译时错误:
int? val = new int?(); val.Value = null;
更何况这val.Value
是一个只读属性,这意味着我们甚至不能使用类似的东西:
val.Value = 3;
但同样,多态重载隐式转换运算符让我们做:
val = 3;
不管怎么说,只要它能正常工作,就不用担心多元化的问题了吗?:)
在VB.Net中.当你可以使用".HasValue"时,不要使用"IsNot Nothing".我刚刚在一个地方用".HasValue"替换了"IsNot Nothing",解决了"操作可能使运行时不稳定"的中等信任错误.我真的不明白为什么,但在编译器中发生了不同的事情.我认为C#中的"!= null"可能会有同样的问题.