??之间的性能差异和==

时间:2019-05-18 11:27:05

标签: c#

要使用布尔可空变量查找真还是假,我可以使用

bool? nullable;
bool non-nullable;
non-nullable = (nullable == true);

...
non-nullable = (nullable ?? false);

结果似乎是相同的:

    nullable    non-nullable result
    --------    -------------------
    true        true
    false       false
    null        false

如果它们是整数,肯定会有区别,但是对于此布尔型示例,我看不到任何区别。
两者之间在性能或功能上有什么区别吗?
对于此布尔示例,是否有理由使用一个而不是另一个?

编辑:固定代码-(nullable ?? true)应该为(nullable ?? false)

2 个答案:

答案 0 :(得分:1)

== 等式运算符在C#和??中是 null-coalescing运算符。

从MSDN站点

  

==(相等)和!=(不相等)运算符检查它们是否   操作数是否相等。

     

??运算符称为空值运算符。它返回   如果操作数不为null,则为左侧操作数;否则为false。否则返回   右操作数。

non-nullable = (nullable == true);

以上语句检查条件,如果可为空的变量包含true,则将true值分配给不可为null的变量,否则分配为false。

bool? nullable;

在您的情况下,您正在创建nullable布尔类型变量,这意味着它可以存储bool值或null

non-nullable = (nullable ?? true);

在以上语句中,如果non-nullable不为空,请将nullable设置为nullable的值;否则,请将其设置为true(在??之后作为常量或默认值提供)。


nullable   non-nullable result (nullable ?? true) why?     
--------   ------------------- ------------------------ 
true        true    
false       false
null        false

(nullable == true)为什么?(将nullable替换为其值)

  1. true == true,条件满足并返回true。
  2. false == true,条件不满足并返回false,因此non-nullable将为false。
  3. null == true,条件不满足并返回false,因此non-nullable将为false。

(nullable ?? false)为什么(nullable ?? true)

  1. true?? false,它检查nullable的值,它包含值true,然后将该值分配给左侧操作数。

  2. 与第一点相同

  3. null ?? false,现在nullable变量包含null值,因此它将false分配给左侧操作数

答案 1 :(得分:1)

您的情况还有另一种表达方式:

non_nullable = nullable.HasValue && nullable.Value;

我不完全知道这实际上是否会比其他指定的变体慢,因为可空类型的运算符也可能在Nullable<T>结构中重载,并且还会涉及方法调用。如果您想确保这一点,则必须对其进行调查和/或进行基准测试。

关于性能的整个讨论:我认为最好先“自然”表达您的代码,以备将来维护。仅在必要时调查性能改进。正如Donald Knuth所说:“过早的优化是万恶之源。”

我对使用哪种表达的建议是,首先使用尽可能清楚表达您意图的表达。我个人的选择是:nullable == true