c#.Net中“var”关键字的意义是什么?

What is the significance of “var” keyword in c#.Net?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Use of var keyword in C#
What's the point of the var keyword?

在使用隐式键入而不是显式键入时,我有点困惑。

如C编码标准中的msdn引用:

Use implicit typing for local variables when the type of the variable
is obvious from the right side of the assignment, or when the precise
type is not important.

我的问题是,当我们已经知道底层变量类型时,为什么需要在这里使用隐式类型?

有什么好处?

请帮助澄清我的疑虑。


以这个为例:

1
2
3
var q = from c in myCollection
        select new
    { c.Value1, c.Value2 };

此处无法确定q的数据类型,因为它是在运行时"匿名类型"生成的。这就是它的主要目的


when we already know the underlying variable type, why do we need to
use implicit typing here? What would be the advantage?

它只是为了方便编码,快速打字,如果你愿意的话,加上你的行变得更短。

在这种情况下,类型在赋值的右侧可见。


看看这个:

1
2
Collection<KeyValuePair<Predicate<T>, Action<T>>> x =
new Collection<KeyValuePair<Predicate<T>, Action<T>>>();

现在看看这个:

1
var x = new Collection<KeyValuePair<Predicate<T>, Action<T>>>();

而且,我敢,我加倍地敢告诉我,使用var关键字是不可能的。

注意:这是基于一些项目中的实际声明,我更不用说了。

很可能您认为使用var关键字有一些缺点,嗯,确实有,但它们都在编译时。您的可执行文件和以前一样好。没错,varobjectdynamicvariant完全不同!相反,它告诉编译器用您分配给它的任何类型声明变量。

例如:

1
2
var x = 1;
x  ="something"; //Error!!!

好吧,听起来可能很傻。"我知道那种类型,你说,"为什么我不能把它放下?"-你问:"看,这很容易。"

1
int x = 1;

好吧,有三个原因:

  • 有时你不知道类型,如星所说。
  • 有时候你只是不想输入类型(提示:看看这个答案的开头)。
  • 有时你想有灵活性,不需要告诉类型。

最后一点在创建文本转换模板或代码片段时特别有用,而且在您的日常复制粘贴中也非常有用。

但是,只要考虑一下如果你改变了一些神秘方法的返回类型…说你有:

1
2
3
4
List<string> MamboJambo()
{
    //...
}

现在你把它改成:

1
2
3
4
IList<string> MamboJambo()
{
    //...
}

哦,不!你现在必须更新50个类。等什么?不,你没有!因为你一直遵循的建议是总是使用var

注意:好吧,这不是现实的例子,但它还是得到了重点。


当您知道基础类型时,隐式类型化变量的唯一优点是,如果您更改了原始类型(对于兼容类型),就不必重新定义它们。

基本上,隐式类型化变量的最大优势是分配类型,这些类型往往是长的和不断变化的(如Linq可枚举的或可查询的)。


var关键字用于变量声明,而不是类型。var的技术术语是"隐式类型化局部变量声明"。变量本身仍然是静态类型(类型是在编译代码时确定的),并且仍然是强类型(类型一旦声明就不能更改)。区别在于我们不再在源代码中显式地声明变量的类型;相反,编译器根据变量的初始化来推断变量的类型。例如:

1
2
3
var maxValue = 500;    
var customerFirstName ="Jimmy";
var stopwatch = new System.Timers.Timer();

在本例中,MaxValue是使用System.Int32类型编译的,CustomerFirstName是System.String,秒表是System.Timers.Timer。如果不明显,当使用var声明变量时,声明中的初始值设定项是强制的。此外,初始值设定项对其有一些限制,包括以下内容:

它必须是返回具有类型的值的表达式;匿名函数声明(例如lambda)无效,但允许使用文本表达式和对象构造函数。它不能返回空类型。它不能引用正在声明的变量。每个语句只允许一个声明;不允许多个声明。更多:http://www.technrepublic.com/blog/programming-and-development/code-concepts-cs-var-keyword/1461


它声明了一个隐式类型化变量。也就是说,在编译时,它将自己确定类型,这样您就不必键入它了。它的主要目的是将一个变量声明为要作为匿名方法的wich。基本上,它允许您键入更少的内容,而不是更多的内容,从代码阅读器的角度来看,如果可能的话,最好指定确切的类型。