[英]What is the best syntax for checking for null value objects in C#
写作总是让我觉得不对
if (MyObject)
// do something
或者逆转
if (!MyObject)
// do something
但是你可能会认为它不那么冗长
if (MyObject != null)
// do something
if (MyObject == null)
// do something
是否有任何非主观原因使用一个而不是另一个?
在C#中,你无法做到
if (MyObject)
检查null
。 这是编译时错误(如果类没有隐式布尔转换运算符)。
if (!MyObject)
如果类没有重载operator !
也是无效的operator !
返回一个布尔值(或一个可以隐式转换为布尔值的值)。
所以你必须坚持使用obj == null
和obj != null
。
总而言之,非主观原因是能够编译您的代码!
曾几何时,在古代C中,没有bool
类型。 零被认为是false
并且每个非零值都被认为是true
。 你可以写
while(1) { }
创建一个无限循环。
你也可以这样做
int n = 10;
while (n--) { }
有一个执行n
次的循环。 这个策略的问题是:
int x = 10;
if (x = 0) { // bug: meant to be x == 0
}
你错过了一个角色并且你创建了一个bug(大多数现代C编译器会在这个语句上发出警告,但它仍然是有效的C)。
这就是你看到代码的原因
if (5 == variable)
if (NULL == pObj)
在许多地方,因为它不容易出现上述错误。
C#设计者决定要求一个布尔表达式作为if
, while
等的条件,并且不允许将类型转换(除非它们明确地声明一个重载的运算符,这是不鼓励的)布尔值以减少错误的机会。 所以像:
object x = null;
if (x) { }
int y = 10;
if (y) { }
while (y--) { }
在C中有效, 不要在C#中编译 。
这不是任何方式的风格或协议问题。
是否有任何非主观原因使用一个而不是另一个?
(1)和(2)不编译的事实是足以不使用它们的非主观原因。
所以我们留下了(3)和(4):
if (MyObject != null)
// do something
if (MyObject == null)
// do something
这取决于如果MyObject为null(4),或者它不是null(3),是否要执行某些操作。 显然,这不是一种风格选择。 采用始终相同的“风格”是荒谬的,因为如果你想要你必须做的另一个条件:
if (MyObject == null) // style policy
{
// nothing here
}
else
{
// do something
}
这不是我所谓的可读代码。
在我看来,在这种情况下,有点冗长的是好事 。 如果你被允许同时做这两件事就是这种情况,这实际上是不可能的,正如Mehrdad指出的那样。 “隐式”空检查(即if (MyObject)
)甚至不在C#中编译。
if (MyObject == null)
// do something
然而,这与使用整数检查大于0的情况非常相似。这里的两个等价选项(在C中编译和运行都很好但不是 C#,除非我弄错了)是:
if (myInt)
// do something
和
if (myInt > 0)
// do something
我总是在这里寻找第二个选项,纯粹是为了清晰(它不能被误认为是bool!),尽管你经常会看到代码中的前“隐式”检查。
在C#中,if语句需要一个布尔表达式。
因此,在上面的示例中使用if(myObject)
来测试null实际上是错误的。 你需要做更详细的if(myObject==null)
。
这取决于个人喜好。 理想情况下,在C#中,要检查null
,使用以下语法 -
if (MyObject != null)
//Do Something.
如果你只是想为一个对象设置一个默认值,如果它是null,你可以使用c#3.0 ?? 运营商。
编码:
MyType _myObject
if (SomeObject==null)
_myObject = defaultObjectValue
else
_myObject = SomeObject
可以写成
_myObject = SomeObject ?? defaultObjectValue;
这基本上意味着如果SomeObject存在,请使用它,如果不存在,则使用默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.