假设valueobject类型,并且永远只有nulltruefalse的值,以下两个表达式的(A)行为和(B)执行之间是否有任何区别:

// Expression 1
value == null ? false : (bool) value
// Expression 2
(bool?) value == true

推荐答案

如果object value只能包含nulltruefalse,它们将返回相同的结果.然而,第二个(不出所料)更贵:

表达式1:

IL_0008: ldloc.0
IL_0009: brfalse.s IL_0013

IL_000b: ldloc.0
IL_000c: unbox.any [System.Runtime]System.Boolean
IL_0011: br.s IL_0014

表达式2:

IL_0008: ldloc.0
IL_0009: unbox.any valuetype [System.Runtime]System.Nullable`1<bool>
IL_000e: stloc.2
IL_000f: ldc.i4.1
IL_0010: stloc.3
IL_0011: ldloca.s 2
IL_0013: call instance !0 valuetype [System.Runtime]System.Nullable`1<bool>::GetValueOrDefault()
IL_0018: ldloc.3
IL_0019: ceq
IL_001b: ldloca.s 2
IL_001d: call instance bool valuetype [System.Runtime]System.Nullable`1<bool>::get_HasValue()
IL_0022: and
IL_0023: stloc.1

The value is true version mentioned in the comments is almost the same as 表达式1:

IL_0008: ldloc.0
IL_0009: isinst [System.Runtime]System.Boolean
IL_000e: brfalse.s IL_0018

IL_0010: ldloc.0
IL_0011: unbox.any [System.Runtime]System.Boolean
IL_0016: br.s IL_0019

它还有一个额外的好处,那就是可以容忍value中的其他类型的值,而不仅仅是nulltruefalse.

Csharp相关问答推荐

我如何才能获得被嘲笑班级的私有成员?

IComponition.获取IReadOnlyCollection的返回默认属性值

在C#中使用in修饰符

C#使用属性和值将JSON转换为XML

使用特定格式的JsonConvert序列化对象

在多对多关系上不删除实体

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

静态对象构造顺序

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

如何从ASP.NET核心MVC视图和Blazor传递数据

DbContext-传递自定义配置选项

使用System.Text.Json进行序列化时发生StackOverflow异常

源代码生成器:CS8795分部方法';Class1.GetS2(字符串)';必须有实现部分,因为它有可访问性修饰符?

使用动态键从请求体反序列化JSON

为什么我的用户界面对象移动到略低于实际目标?

如何在Polly重试策略成功之前将HttpClient请求排队?

Azure函数正在返回值列表,但该列表在Chrome中显示为空

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)