在我的理解中,c#最初是一门静态语言,随着。net框架的一些增强,开始支持语言的动态特性。
我认为c#中的"var"关键字在运行时加载dll时非常强大,而且我们不知道将要加载的类型,它非常有帮助。
但是我认为它带来了确定变量类型的开销,如果变量在设计时被声明为var。现在,re-sharper负责通过做一些好的建议使我们的代码更漂亮,更干净,它给我的建议如下:
我的代码是这样的:
StatusResult result = new StatusResult();
Resharper建议它必须转换成
var result = new StatusResult();
为什么?当我认为resharper的建议不是个好主意时,我为什么要相信它呢?或许是我错了?
这主要是一个基于意见的问题,但有一个问题值得解决:区分类型推断和动态类型是非常重要的。
在dynamic i = 0;
中,i
被声明为动态变量,其类型仅在运行时解析。这可能会导致开销。
var i = 0;
中,i
将声明为int。var
关键字仅表示编译器将在编译时推断变量类型。没有"设计时"类型推断开销,因为var i = 1;
和int i = 1
编译成相同的指令集。
关于你的问题,
为什么?当我认为resharper的建议不是个好主意时,我为什么要相信它呢?
这是我的意见从我的经验。接受这个特殊建议的一些好处:
- 它有助于重构,因为StatusResult只发生一次
- 它缩短了行,并删除了一个多余的声明,这很容易被阅读代码的人推断出来
- 编码 时,输入更少,行写得更快
var result = GetStatusResult(); // A method call
我个人不会使用var,因为维护人员现在需要grok GetStatusResult()来查看var是什么。
在一天结束的时候,这是个人的决定,除非你必须遵循一个编码标准,在这种情况下,你应该游说改变标准,或者只是跟着它走。
作为旁注,正如Benesh在下面提到的,var != dynamic。我想这就是我受到坏名声的地方。加上我在上面提供的不使用它的例子中过度使用