gpt4 book ai didi

c# - 合并顺序检查

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:57 24 4
gpt4 key购买 nike

有一个类 A 具有 Nullable 属性 Prop

public class A {
int? Prop {get; set;}
}

...

我有对象 a 类型为 A有条件的:

if (a != null && a.Prop.HasValue) { // <--
int res = a.Prop;
}

我收到建议 “合并顺序检查”

我不明白我怎么能那样做。 a?.Prop.HasValue 将不起作用

我在这里错过了什么?

最佳答案

Resharper 转换您的原始逻辑:

if (a != null && a.Prop.HasValue)

进入这个:

if (a?.Prop != null)

因此,只要表达式的计算结果不为 null,该 block 就会执行,如果 a 中的任何一个,它就会计算为 nullnull(感谢 ?.)或者如果 a.Propnull(正常)。在这两个版本中,您基本上是在说“只要 aa.Prop 都具有值就执行此操作”(或者实际上是“...不要有值(value)观”)。

不过,我不确定我是否喜欢这些重构。事实上,我可以看到 in this other question JetBrains 自己并不一定认为这些是好的重构,因为它们使代码更难理解。

事实上,我认为可能特别是因为这些形式更难理解,这种“合并顺序检查”重构实际上在某些情况下损坏,因为至少 end of April 2017 ( also here ),并且目前仍然截至 2018 年 2 月底。

当表达式同时包含 || 运算符和 AnyAll LINQ 方法(和其他情况也一样,比如返回 bool 的函数调用。

给定:

var array = new[] { 1, 2, 3, 4, 5 };

Resharper 将转换为:

if (array == null || !array.Any())

进入这个:

if (!array?.Any() != true) // WRONG

原文显然是“如果 arraynull,或者如果 array 为空,则执行此操作”。

但是第二个版本是怎么说的呢?它很难读,您几乎无法判断它是对还是错。

!= true 实际上意味着“如果表达式为 nullfalse 则执行此操作”。好的,如果 array 为 null,我们将执行此操作,到目前为止这很好。但是,如果数组不为空,那又怎样呢?

好吧,我们想在数组为空时执行这些操作。如果数组为空,则 array?.Any() 将为 false

然后我们有 !false,它是 true

然后我们有 true != truefalse

所以我们有“如果数组为空......不执行 block ”,这与我们想要的相反。

因此 Resharper 的逻辑倒退了,如果一个值, block 就会执行,而不是没有一个值。

即使没有这个缺陷,代码也很难阅读,所以我觉得通常应该避免这种重构。

关于c# - 合并顺序检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com