lc.*_*lc. 408 .net c# null nullable
我总是使用(a)Nullable<>.HasValue因为我喜欢语义.然而,最近我正在研究其他人现有的代码库,他们Nullable<> != null专门使用(b)代替.是否有理由使用一个而不是另一个,还是纯粹的偏好?
(一个)
int? a;
if (a.HasValue)
// ...
Run Code Online (Sandbox Code Playgroud)
(b)中
int? b;
if (b != null)
// ...
Run Code Online (Sandbox Code Playgroud)
Rex*_*x M 440
编译器将null比较替换为调用HasValue,因此没有真正的区别.只要做一个对您和您的同事更具可读性/更有意义的事情.
cbp*_*cbp 43
我更喜欢(a != null)语法匹配引用类型.
Per*_*son 21
我通过使用不同的方法将值赋给可空int来对此进行了一些研究.这是我做各种事情时发生的事情.应该澄清发生了什么.请记住:Nullable<something>或者简写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.")
Run Code Online (Sandbox Code Playgroud)
好的,让我们尝试下一个初始化方法:
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.")
Run Code Online (Sandbox Code Playgroud)
和以前一样.请记住int? val = new int?(null);,使用null传递给构造函数初始化会产生COMPILE时间错误,因为可空对象的VALUE不可为空.只有包装器对象本身才能等于null.
同样,我们会得到一个编译时错误:
int? val = new int?();
val.Value = null;
Run Code Online (Sandbox Code Playgroud)
更何况这val.Value是一个只读属性,这意味着我们甚至不能使用类似的东西:
val.Value = 3;
Run Code Online (Sandbox Code Playgroud)
但同样,多态重载隐式转换运算符让我们做:
val = 3;
Run Code Online (Sandbox Code Playgroud)
不管怎么说,只要它能正常工作,就不用担心多元化的问题了吗?:)
Car*_*lin 13
在VB.Net中.当你可以使用".HasValue"时,不要使用"IsNot Nothing".我刚刚在一个地方用".HasValue"替换了"IsNot Nothing",解决了"操作可能使运行时不稳定"的中等信任错误.我真的不明白为什么,但在编译器中发生了不同的事情.我认为C#中的"!= null"可能会有同样的问题.
| 归档时间: |
|
| 查看次数: |
88852 次 |
| 最近记录: |