我在VS2010中编写c#并且已经测试了一个名为ReSharper的插件。根据我的经验,我觉得它可以清理代码并简化不必要的逻辑。然而,它在我的代码中找到的主要问题之一是我在初始化变量时。
Resparper建议初始化机智“var”
int i = 0 ----> var i = 0
or...
MyClass1 MyClass = new MyClass(1)
我一直认为使用var有一点点开销,似乎很懒惰或松散类型(尽管我确实它有一些优点)。我一直在努力寻找是否有充分的理由来初始化这样的变量。 Reshaper说使用var是一个有争议的问题,但它有很好的扩展用于初始化。有谁知道这可能会或不会是什么?
答案 0 :(得分:7)
显式变量类型用法vs var只是一个偏好问题。你可以在resharper中关闭它。
答案 1 :(得分:5)
如果这很懒惰,那么我不想提高效率。
Dictionary<int, Dictionary<string, string>> map =
new Dictionary<int, Dictionary<string, string>>();
var map = new Dictionary<int, Dictionary<string, string>>();
答案 2 :(得分:3)
使用var
只是使用隐式类型而不是显式调用该类型,使用var
声明的变量仍然是强类型的,并且将被编译为相同的代码作为显式类型变量 - 没有开销。
唯一不同的是,当你想要的变量类型与它所分配的表达式不同时,即当表达式返回一个实现该表达式的具体类时,你希望变量具有接口的类型接口。在这些情况下,您应该明确声明变量。
答案 3 :(得分:3)
var
没有运行时开销和相当小的编译时开销。它产生的IL代码实际上等同于使用显式类型。您是否愿意使用它完全是一个偏好问题。我个人设置Resharper不打扰我,除非初始化使类型明显:
Person p = new Person(); // Resharper bugs me
int i = 0; // Resharper leaves this alone.
答案 4 :(得分:2)
关键在于,当您指定一个直接使用new Classname(...)
的变量时,您显然绝对且唯一地知道变量的最终类型,因为只是调用了构造函数。
在这种情况下,var具有良好的语法并使事情紧凑,其优点是如果将来您将使用其他类型的对象更改赋值,则更改很少。
如果分配的对象类型不是很清楚,我仍然希望明确说明。
但最终几乎是一个哲学问题:D
答案 5 :(得分:1)
var
本身不是一种类型。它只是命令编译器在初始化的右侧查找类型,这就是为什么以下不能编译:
var x; // invalid because x is still statically typed
因此,它既不会对编译时间产生不良影响,也不会产生任何运行时开销。它基本上是syntactic sugar,生成的“机器”代码将是相同的。