C#初始化变量

C#初始化变量,c#,visual-studio-2010,initialization,resharper,C#,Visual Studio 2010,Initialization,Resharper,我正在VS2010中编写c#,并一直在测试一个名为ReSharper的插件。根据我的经验,我觉得它清理了代码,简化了不必要的逻辑。然而,它在我的代码中遇到的一个主要问题是初始化变量的时候 Resparper建议使用“var”初始化 我一直认为使用var会有一点开销,而且似乎有点懒惰或松散类型(尽管我确实意识到它有一些优点)。我一直很难找到是否有一个很好的理由来初始化这样的变量。重塑者说,使用var是一个有争议的问题,但它有很好的扩展用于初始化。有人知道这可能是什么,也可能不是 显式变量类型用法v

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

Resparper建议使用“var”初始化


我一直认为使用var会有一点开销,而且似乎有点懒惰或松散类型(尽管我确实意识到它有一些优点)。我一直很难找到是否有一个很好的理由来初始化这样的变量。重塑者说,使用var是一个有争议的问题,但它有很好的扩展用于初始化。有人知道这可能是什么,也可能不是

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


使用
var
只是使用隐式类型而不是显式调用类型,使用
var
声明的变量仍然是强类型的,将被编译为与显式类型变量相同的代码-没有开销


唯一存在差异的情况是,当您希望变量的类型不同于其指定给的表达式时,即当表达式返回实现该接口的具体类时,您希望变量具有接口的类型。在这些情况下,您应该显式地声明变量。

如果这是惰性的,那么我不希望有效率

Dictionary<int, Dictionary<string, string>> map = 
    new Dictionary<int, Dictionary<string, string>>();

var map = new Dictionary<int, Dictionary<string, string>>();
字典映射=
新字典();
var map=newdictionary();

关键是,当您直接使用
新类名(…)
分配变量时,您清楚地绝对且唯一地知道变量的最终类型,因为您刚刚调用了构造函数

在本例中,var有一个很好的语法并使事情紧凑,其优点是,如果将来您将使用另一种类型的对象更改赋值,那么更改是最小的

在不完全清楚指定对象类型的情况下,我仍然喜欢将其显式化


但最终几乎是一个哲学问题:D

var
没有运行时开销,编译时开销相当小。如果使用显式类型,它生成的IL代码实际上相当于。你是否愿意使用它完全取决于你的喜好。我个人将Resharper设置为不打扰我,除非初始化使类型变得明显:

Person p = new Person(); // Resharper bugs me
int i = 0; // Resharper leaves this alone.

var
本身不是一种类型。它只是命令编译器在初始化的右侧查找类型,这就是为什么下面的代码无法编译:

var x; // invalid because x is still statically typed 

因此,它既不会对编译时间产生不良影响,也不会产生任何运行时开销。基本上,生成的“机器”代码是相同的。

如果你想了解更多关于var的信息,这里有一个非常明确的讨论:有人已经明确地声明了var,为什么有人更愿意将声明更改为var?有什么意见吗?@mbeckish:Chaospanion很好地回答了这个问题@StriplingWarrior-对于调用构造函数的情况,我同意您的回答和解释。我对JBone的第一个例子更感好奇:“inti=0-->var I=0”。@StriplingWarrior@mbeckish有些人这样做是为了统一。例如,对于我参与的一个项目,使用var@BalaR-您是否发现始终使用var的一致性有什么好处?在我看来,更好的一致性规则应该是“声明的变量的类型应该在语句中显式声明一次。”您必须以任意方式键入一次-首先键入它,然后按tab键几次,它会在新的语句之后为您填充下半部分。无论是哪种方式,你只输入一次。@ Teels-这是正确的,但是考虑不要重复你自己的原则。我认为这不适用于此。尤其是浏览器中的代码辅助功能。如果您手动键入,这是一回事,但当您按预期使用工具时,DRY不适用。@tsells-无意冒犯,但这是一个荒谬的断言。干式原理很容易理解,当你不遵循它时,它是非常明显的。事实上,我要说的是,这个原则远远高于任何编程语言或开发环境。@chaosption一条建议——当你不得不在声明的开头加上“无意冒犯”的字眼时,你可能会想重新考虑它对当前的讨论有多大的帮助。根据您的理论,在引入var关键字之前,.Net中的每个变量初始化都违反了DRY原则。这就是为什么我做出了这样的断言——不管你认为这有多可笑。很荣幸。。。。。。。
var x; // invalid because x is still statically typed