C#初始化变量

时间:2011-08-31 18:06:24

标签: c# visual-studio-2010 initialization resharper

我在VS2010中编写c#并且已经测试了一个名为ReSharper的插件。根据我的经验,我觉得它可以清理代码并简化不必要的逻辑。然而,它在我的代码中找到的主要问题之一是我在初始化变量时。

Resparper建议初始化机智“var”

int i = 0  ----> var i = 0
           or...
MyClass1 MyClass = new MyClass(1)

我一直认为使用var有一点点开销,似乎很懒惰或松散类型(尽管我确实它有一些优点)。我一直在努力寻找是否有充分的理由来初始化这样的变量。 Reshaper说使用var是一个有争议的问题,但它有很好的扩展用于初始化。有谁知道这可能会或不会是什么?

6 个答案:

答案 0 :(得分:7)

显式变量类型用法vs var只是一个偏好问题。你可以在resharper中关闭它。

enter image description here

答案 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,生成的“机器”代码将是相同的。