C# 正在查找布尔语句的解释
我在我正在使用的一个库中找到了这个语句。它应该检查集群中的当前节点是否为前导节点。下面的语句是:C# 正在查找布尔语句的解释,c#,boolean,C#,Boolean,我在我正在使用的一个库中找到了这个语句。它应该检查集群中的当前节点是否为前导节点。下面的语句是:(!(cluster.Leader?.IsRemote??true)) 为什么不直接使用(cluster.Leader?.IsRemote)?(忽略!接线员,我知道它是如何工作的) 这个方法有什么好处吗?< /P> < P>这意味着,如果 Copy.Sudio.IsRead 是 null ,那么考虑是否是真的?正确 有效null??真等于真 因此,如果您的leader为null,则整个语句将返回fal
(!(cluster.Leader?.IsRemote??true))
为什么不直接使用(cluster.Leader?.IsRemote)
?(忽略!接线员,我知道它是如何工作的)
这个方法有什么好处吗?< /P> < P>这意味着,如果<代码> Copy.Sudio.IsRead 是<代码> null <代码>,那么考虑是否是真的<代码>?正确
有效null??真
等于真
因此,如果您的
leader
为null,则整个语句将返回false)。没有??null
您的语句甚至无法编译,因为!空值
不表示任何内容。请考虑以下代码:
public class Foo
{
public bool IsBar { get; set; }
}
var foo = new Foo();
Console.WriteLine(!(foo?.IsBar ?? true));
当IsBar
声明为常规的、不可为空的bool时,foo?.IsBar
中的?
运算符使该表达式的类型为bool?
,而不是bool
您不能在布尔表达式中使用可为null的布尔值,请参见,因此您需要使表达式显式化:如果foo
,因此foo?。IsBar
为null
这就是??正确
输入。备选方案:
Console.WriteLine(!(foo?.IsBar).GetValueOrDefault(true));
Console.WriteLine(foo?.IsBar == false);
让我们为您构建一个真理表
构造(请注意,我们需要考虑三个值:true
,false
,null
):
让我们考虑下面的代码
class Program
{
static void Main(string[] args)
{
Cluster cluster = new Cluster { Leader = null };
var libresult = (!(cluster.Leader?.IsRemote ?? true));
var result = (!(cluster.Leader?.IsRemote));
}
}
class Cluster
{
public Leader Leader { get; set; }
}
class Leader
{
public bool IsRemote { get; set; }
}
正如您在上面的代码中看到的,Leader为null
如果考虑条件为
var result = (!(cluster.Leader?.IsRemote));
var libresult = (!(cluster.Leader?.IsRemote ?? true));
然后
空条件/Elvis运算符(?)
为集群.Leader?返回null。IsRemoteso!(null)将为null
但如果考虑条件为
var result = (!(cluster.Leader?.IsRemote));
var libresult = (!(cluster.Leader?.IsRemote ?? true));
然后正如我们在上面看到的Null条件/Elvis运算符(?)为cluster.Leader?返回Null。IsRemote
所以,现在的条件是!(空??真)
据
空排序符(??)运算符
(null??true)
将返回true。还有!(真)将假
所以,“??true”的好处是,如果左侧的值为空
然后,它应该被认为是布尔(true)。
因为使用前一种方法的结果是
bool
,而使用后一种方法的结果是bool?
。这取决于上下文,更合适的是什么(显然,如果Leader
为null
,您将有不同的值)。另外,后一个不能直接用于需要bool
的语句,比如if
。为什么要从这个答案中删除accept?少了什么?
var libresult = (!(cluster.Leader?.IsRemote ?? true));