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
被声明为 int。 var
关键字仅表示编译器将在编译时推断变量类型。没有“设计时”类型推断开销,因为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 脚本可在朋友不在频道中的情况下向他们发送私人消息