Resharper 是不是正确?
Posted
技术标签:
【中文标题】Resharper 是不是正确?【英文标题】:Is Resharper correct?Resharper 是否正确? 【发布时间】:2010-11-20 21:45:37 【问题描述】:我刚刚安装了 Reshaper 4.5,它提出了以下建议:
return this.GetRuleViolations().Count() == 0; -- REMOVE this.
new string[] this.ID.ToString(), this.Registration -- REMOVE string, MAKE ANONYMOUS TYPE
int i = Method.GetNumber(); -- REPLACE int WITH var
我应该这样做吗?
我认为在某些情况下它会降低代码的可读性,但会提高性能吗?进行这些更改有什么好处?
谢谢
【问题讨论】:
只有一首 Rigobert Song。请务必在此论坛上查看此子问题的各种重复出现。 尝试安装 StyleCop 和 StyleCop-for-ReSharper,这将为您提供 Microsoft 推荐的编码风格指南。不过,您需要调整 R# 的规则以匹配。至于 var 的使用,我们总是在内部使用它,因为我们认为它有助于提高可读性 - 类型是针对编译器的,而不是人类的。 嗯。我一直使用这种类型——我想我觉得你应该知道你从你的 lambda 表达式中得到了什么,如果你直接指定它会有所帮助。 与您的问题无关,但使用Any()
而不是 Count() == 0
是更好的选择,因为后者可能必须枚举整个集合来告诉您它是否为空。
【参考方案1】:
1) 显式this
指针仅在引用不明确时才需要。由于GetRuleViolations
是在类型上定义的,因此您很可能不需要this
。
这里的另一点是,如果GetRuleViolations
返回一个IEnumerable
的东西,你通常会更好地使用Any()
而不是Count() == 0
,因为你冒着枚举整个序列的风险。
2) 可以从初始化中推断出字符串。
3) Resharper 更喜欢var
而不是特定类型。
【讨论】:
【参考方案2】:除了你的小方块变绿的明显好处之外,如果你正在编写稍后将由其他人维护的代码,那么在编码语法中不要使用你的个人偏好是很有意义的。 Resharper 在格式化代码方面变得非常有用,这种方式可以被广泛的受众识别。
我属于那种认为谁的方法正确并不重要的思想流派。如果我们都坚持一个模式,我们都会发现阅读彼此的代码会更容易。
所以,在我看来,不要更改默认的锐化器设置。只需接受,如果您使用默认设置,您可以让每个人的生活变得简单。
【讨论】:
我同意您使用默认工具的观点。不幸的是,据我所见,我不喜欢 Resharper 的默认设置 由于安全性,我总是将 resharper 的 'var' 设置更改为显式类型。可读性很好,但在有人重构后可能会造成严重损害。【参考方案3】:我认为第一个是为了这个目的,如果你想让“GetRuleViolations()”成为一个静态方法。那么您不必删除“this”标识符。
【讨论】:
【参考方案4】:对于第三个 - 最让我烦恼的一个。它为读者提供的信息更少,我认为这只是炫耀一个新功能的问题。
我会说 - 当你知道返回类型时使用 var 并在你不喜欢这样的时候使用正确的对象类型:
var reader = new XmlReader(.... // Implicit
XmlReader reader = SomeClass.GetReader() // Explicit when you can't be sure
【讨论】:
【参考方案5】:第一个:Resharper 询问是否删除this
,这对我来说只是一种风格。仅此而已,保留它不会以任何方式损害性能。这只是可读性的问题。
对于第二个和第三个:Resharper 通常更喜欢使用var
而不是特定的数据类型,这就是建议的原因。我相信这是个人选择的问题,除了可读性之外没有其他好处。
【讨论】:
【参考方案6】:第一个对我来说似乎不清楚。只要没有歧义,您通常不必在 this.
前面加上前缀,我无法从这个例子中看出这一点。 Resharper 可能是对的。其他两个不会提高性能,编译结果是一样的。这只是口味问题,当然还有您的编码指南。
【讨论】:
【参考方案7】:第一个应该是可配置的。据我记得,你可以告诉 ReSharper 你是否想要“这个”。仅在字段、方法前面,两者都有或没有。
使用“var”不会改变生成的 CIL 代码中的任何内容,因此性能将保持不变。我已经有一段时间没有使用 ReSharper,也不知道为什么它会如此积极地推广匿名类型,但是“var”的一个优点是它更能抵抗更改。
意思是,如果您调用包装器而不是调用 Method.GetNumber(),例如。 Filter(Method.GetNumber()) 在返回 Nullable 的同一行中,您不必更新变量的类型。
【讨论】:
【参考方案8】:这些都不会对性能产生任何影响,只会影响可读性。
我发现建议 1 和 2 的可读性更高,而建议 3 的可读性低于原始代码。
但是,如果您发现这些建议的可读性较差或违反了您公司的代码样式标准,则您不必只遵循这些建议。当您将光标放在波浪线上时,按 Alt-Enter 以显示上下文操作列表。其中之一是改变检查的严重程度;您根本无法显示它或将其显示为提示。您可以在 ReSharper | 找到完整的检查列表。选项 |代码检查 |检查严重性。
【讨论】:
以上是关于Resharper 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
ReSharper 声称我的表达总是正确的?它是正确的还是一个错误?
ReSharper 卸载 - Visual Studio 不再显示正确的错误突出显示
如何为 ReSharper 扩展找到正确版本的“Wave”?
如何使用 Visual Studio 或 Resharper(或任何其他工具!)将 HTML 正确粘贴到 C# 代码中?