null 条件运算符 return 如果为 null 是否为 false?
Does null conditional operator return false if null?
我有这个条件
if (item?.Value2?.GetType() != typeof(string) && item.get_Value() == 0)
我相信如果项目为空,?.
操作将 return 为空,我相信这将被解决为 false
导致条件短路,一切都会好起来的(item.get_Value()
不会被调用)
不过我不确定,我想也许我需要这样做
if (item?.Value2?.GetType() ?? 0 != typeof(string) && item.get_Value() == 0)
但我认为这可能有点矫枉过正,第一种方法是否可以避免潜在的空引用异常?
item?.Value2?.GetType()
将 return null
如果 item
是 null
或 Value2
是 null
.
评估的条件将是
if (null != typeof(string) && item.get_Value() == 0)
所以第一个条件将被解析为 true
导致 NullReferenceException
当 item.get_Value() == 0
将被执行时(但仅当 item
为 null
时,而不是 Value2
)
.Value2
更快,但对于格式为日期或货币的单元格,.Value2
returns Double,但 .Value
或 .get_Value()
return 日期时间和十进制。如果单元格是数字类型,则两者都会产生 Double,如果值不是数字类型或格式化为文本的数字,则会产生 String。 return 类型也可以是 Boolean 表示 TRUE 和 FALSE,Integer 表示错误。
if (0.0.Equals(item.Value2)) // if (item.Value2 is Double && (Double)(item.Value2) == 0.0)
这可能看起来很奇怪,但这是检查 运行 时间 type is Double and equal 是否为 0.0 的最短和最安全的方法。 (如果是枚举Range的结果,item不为null)
至于实际问题,找到第0个单元格:
Range cell = range.Find(0, LookAt: XlLookAt.xlWhole);
if (cell != null) { /* ... */ }
我有这个条件
if (item?.Value2?.GetType() != typeof(string) && item.get_Value() == 0)
我相信如果项目为空,?.
操作将 return 为空,我相信这将被解决为 false
导致条件短路,一切都会好起来的(item.get_Value()
不会被调用)
不过我不确定,我想也许我需要这样做
if (item?.Value2?.GetType() ?? 0 != typeof(string) && item.get_Value() == 0)
但我认为这可能有点矫枉过正,第一种方法是否可以避免潜在的空引用异常?
item?.Value2?.GetType()
将 return null
如果 item
是 null
或 Value2
是 null
.
评估的条件将是
if (null != typeof(string) && item.get_Value() == 0)
所以第一个条件将被解析为 true
导致 NullReferenceException
当 item.get_Value() == 0
将被执行时(但仅当 item
为 null
时,而不是 Value2
)
.Value2
更快,但对于格式为日期或货币的单元格,.Value2
returns Double,但 .Value
或 .get_Value()
return 日期时间和十进制。如果单元格是数字类型,则两者都会产生 Double,如果值不是数字类型或格式化为文本的数字,则会产生 String。 return 类型也可以是 Boolean 表示 TRUE 和 FALSE,Integer 表示错误。
if (0.0.Equals(item.Value2)) // if (item.Value2 is Double && (Double)(item.Value2) == 0.0)
这可能看起来很奇怪,但这是检查 运行 时间 type is Double and equal 是否为 0.0 的最短和最安全的方法。 (如果是枚举Range的结果,item不为null)
至于实际问题,找到第0个单元格:
Range cell = range.Find(0, LookAt: XlLookAt.xlWhole);
if (cell != null) { /* ... */ }