Re-Sharper 在啥假设下向我显示“使用隐式类型的局部变量”消息?

Posted

技术标签:

【中文标题】Re-Sharper 在啥假设下向我显示“使用隐式类型的局部变量”消息?【英文标题】:Under what assumption does Re-Sharper shows me "Use implicitly typed local variable" message?Re-Sharper 在什么假设下向我显示“使用隐式类型的局部变量”消息? 【发布时间】:2014-05-07 06:04:09 【问题描述】:

据我了解,C# 最初是一种静态语言,在 .NET 框架中进行了一些增强,并开始支持该语言的动态特性。

我认为 c# 中的“var”关键字在运行时加载 DLL 时非常强大,而且我们不知道会出现哪些类型,这非常有帮助。

但我认为如果在设计时已将变量声明为 var,则会带来确定变量类型的开销。现在,re-sharper 负责通过提出一些不错的建议使我们的代码更漂亮、更简洁,它向我提出了如下建议:

我的代码如下所示:

StatusResult result = new StatusResult();

Resharper 建议必须转换成

 var result = new StatusResult();

这是为什么呢?当我认为这不是一个好主意时,我为什么要购买 resharper 的建议?还是我错了?

【问题讨论】:

如果不符合您的“约定”,您可以在 resharper 设置中更改该行为。既不是写也不是错,但你希望在你的代码库中保持一致。很多人喜欢var,因为它通常很明显类型是什么(或者使用 IDE 中的工具很容易找到) 这里是选项所在的位置(resharper 8):Resharper -> 选项 -> 代码检查 -> 检查严重性 -> c# -> 语言使用机会 -> 使用 'var' 关键字 ... Californicated,注意你可能误解了var 的意思——“编译器请为我输入,我懒得自己输入”。我不确定您对var 的理解是什么,但我怀疑您认为它是dynamic(这是完全不同的概念),请参阅***.com/questions/961581/… 还有:***.com/questions/1873873/… var 不是动态类型。它是静态类型,但编译器在编译时(而不是在运行时)确定类型。所以你的整个问题在现实中没有根据。 【参考方案1】:

这主要是一个基于意见的问题,但有一个问题值得解决: 区分类型推断和动态类型非常重要。

dynamic i = 0; 中,i 被声明为动态变量,其类型仅在运行时解析。这可能会导致开销。

var i = 0; 中,i 被声明为 intvar 关键字仅表示编译器将在编译时推断变量类型。没有“设计时”类型推断开销,因为var i = 1;int i = 1 编译为同一组指令。它与动态类型无关。

【讨论】:

【参考方案2】:

关于你的问题,

这是为什么呢?当我认为这不是一个好主意时,我为什么要购买 resharper 的建议?

这是我的经验意见。接受这个特殊建议的一些专业人士:

它有助于重构,因为 StatusResult 只出现一次 它缩短了行并删除了阅读代码的人很容易推断出的冗余声明 打字少,编码时行写得更快

现在,如果代码行是:

var result = GetStatusResult();  // A method call

我个人不会使用 var,因为维护者现在需要深入了解 GetStatusResult() 以查看 var 是什么。

归根结底,这是个人决定,除非您必须遵循编码标准,在这种情况下,您应该游说更改标准或遵从它。

作为旁注,正如 Benesh 在下面提到的,var != dynamic。我认为这是 var 名声不好的地方。加上我上面提供的何时不使用它的示例中的过度使用。

【讨论】:

以上是关于Re-Sharper 在啥假设下向我显示“使用隐式类型的局部变量”消息?的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:每当我在不和谐的情况下向我的机器人输入 PM 时,都无法读取未定义的属性“id”

如何让用户在没有链接的情况下向他们的朋友发送私信?

Discord 脚本可在朋友不在频道中的情况下向他们发送私人消息

在啥情况下 viewWillAppear 会被调用?

在没有自定义单元格的情况下向 uitableview 显示详细信息披露按钮

在没有TypeInfo的情况下向Jackson提供自定义对象实例