C# &引用;“冗余代码检测”;在受保护或范围更大的属性和字段上的工作方式不同

C# &引用;“冗余代码检测”;在受保护或范围更大的属性和字段上的工作方式不同,c#,resharper,C#,Resharper,在下面的代码示例中,R#将告诉我赋值是冗余的。 这对我来说很有意义 private string _name = null; // Redundant code warning 但是,一旦字段/属性得到保护或更高,情况就不同了 protected string Name = null; // No Redundant code warning 这是R#中的一个bug还是背后的原因?这是因为在不寻找派生类的情况下,ReSharper无法判断它是否已被使用,因此它在谨慎方面出错,并假设它已在

在下面的代码示例中,R#将告诉我赋值是冗余的。 这对我来说很有意义

private string _name = null;   // Redundant code warning
但是,一旦字段/属性得到保护或更高,情况就不同了

protected string Name = null; // No Redundant code warning

这是R#中的一个bug还是背后的原因?

这是因为在不寻找派生类的情况下,ReSharper无法判断它是否已被使用,因此它在谨慎方面出错,并假设它已在某处被使用。如果启用解决方案范围的分析,ReSharper将能够看到整个解决方案,并知道该字段是否用于派生类中。然后它会显示冗余代码警告。

耶看起来很奇怪,还没注意到^^^因为它不一定是冗余的?我猜,如果你封了班,你会得到警告。但是我还没有试过。好吧,当密封时,受保护的将被警告,所以让我们忽略这个事实,但我不明白为什么这不会是多余的。你能在这里解释一下你的理由吗?当然,解决方案范围的分析和解决方案一样好。您可能需要一个“主解决方案”,其中包括相互引用的所有项目。我认为这在数学中被称为a,它与字段或属性的用法无关。我认为这不是问题的答案。这是关于默认值的初始赋值,我看不出派生类在这方面会有什么不同。@CSharpie不,这是正确的答案。您的问题特别是关于ReSharper突出显示冗余空赋值的问题,@citizenmatt的回答解释了为什么ReSharper在默认情况下不标记
受保护的
字段(您需要打开解决方案范围的分析,以便它也标记它)。所以这不是一个bug,但是您需要自己明确地启用它。在任何情况下,将默认值(
null,在本例中为
)分配给字段都是多余的,因为编译器会为您执行此操作。好的,我理解,但我不明白为什么在这种情况下,您需要在启用soloutionwide分析之前启用它。这一部分对我来说毫无意义,尤其是因为solutionwide分析是一个巨大的性能杀手。因此,我们可以同意,这种行为背后没有真正的原因,因为在任何情况下(从语言角度看,这是不可能的),这不是冗余的。它不标记的原因是因为它基于构造函数中发生的事情。ReSharper并不抱怨将字段设置为默认值(尽管严格来说这也是多余的)。相反,它抱怨在字段初始化器和构造函数中设置值是多余的。如果字段受到保护,则除非它查看所有派生类的构造函数,否则无法判断是否发生了这种情况,这需要进行解决方案范围的分析。