C# 我可以在OR语句中将对象作为另一个条件包含空检查吗?

C# 我可以在OR语句中将对象作为另一个条件包含空检查吗?,c#,null-check,C#,Null Check,可能重复: 我不知道如何正确表达问题的标题,但用一行代码就可以很简单地解释: if (someObject == null || someObject.someProperty) ... 我可以这样做吗?或者这个: if (someObject != null && someObject.someProperty) ... 对 仅当第一个操作数为false时,才会计算第二个操作数 不过,显然,第二个操作数也必须是布尔值 类似地,&&仅在第一个操作数为true

可能重复:

我不知道如何正确表达问题的标题,但用一行代码就可以很简单地解释:

if (someObject == null || someObject.someProperty)
    ...
我可以这样做吗?或者这个:

if (someObject != null && someObject.someProperty)
    ...

仅当第一个操作数为
false
时,才会计算第二个操作数

不过,显然,第二个操作数也必须是布尔值

类似地,
&&
仅在第一个操作数为
true
时计算第二个操作数


这称为短路。

是的,这是安全的<代码>|和
&&
是。从:

条件OR运算符(| |)对其布尔操作数执行逻辑OR运算,但仅在必要时计算其第二个操作数

手术

x || y
x | y
对应于操作

x || y
x | y
但如果x为真,则不计算y(因为无论y的值是什么,OR运算的结果都为真)。这就是所谓的“短路”评估


是的,通常在if语句中使用空检查,通常与AND一起使用

这是有效的,因为如果第一个为真,语句将短路并结束

这两项都是有效的:

if(something != null && something.Bool)
  ...

if(something != null || something.Bool)
  ...

是的,
|
&
都短路。事实上,您偶尔会看到人们编写这样的代码:

x != null && x.f();
这相当于:

if(x != null) x.f();

(大多数时候可能不是一个好主意,因为它不利于可读性。)

是的,你可以,但是你想要哪一个取决于你所追求的语义

在第一种情况下,如果根本没有对象,或者如果属性返回true,则条件将运行。基本上,缺少实例意味着应该执行条件逻辑

在第二种情况下,缺少实例不会导致您的条件运行;在这种情况下,您必须同时拥有一个实例,并且属性的计算结果必须为true


我今天在加载用户首选项时处理了同样的问题。我必须决定是否“检查”了首选项,并且由于我们可以添加新的首选项(不为每个用户在数据库中添加该首选项的行),我选择了后一个条件,因为它符合我的用例。

您尝试过吗?你可以用(VB.NET风格)翻译这些运算符:
OrElse
+
哪一个更有意义。@TimSchmelter不确定“更有意义”你知道什么。如果你在C#中工作,你应该了解短路及其行为,正如一个VB.Net程序员应该知道
以及
之间的区别一样@Andy:由于OP不知道操作符及其作用,我用VB.Net来强调它们的含义(imho
比另一个
更有意义)@TimSchmelter我不反对指出VB.Net中的等价物;这是“更有意义”的部分。这是您的意见,但以我的经验,大多数C#开发者完全理解
&
|
短路,对我们来说,这一点非常清楚,特别是因为
&
通常只在需要位运算符时使用。@Andy:是的,但显然不适用于OP,否则这个问题就毫无意义了;)我还补充了问题的第二部分,但你的回答太快了。。。我认为这应该是相似的,不是吗?我认为你可能在第二个陈述中犯了一个错误