This article is currently in the process of being translated into Chinese (~85% done).
Implicitly typed variables (the var keyword)
自C# 3.0版以后就可以在变量定义的左边使用var关键字,而不用明确变量的类型。当然,这只允许用在方法内部 - 类一级的变量还是必需要明确变量类型。来看看var关键字的用法:
int age = 42; // Explicitly typed variable
var name = "John Doe"; // Implicitly typed variable
两个变量 - 一个用int类型定义,另一个使用var关键字定义,而没有明确为string。注意代码中两处的定义都赋了初值,因为虽然对于定义明确类型的变量来说这不是必需的,使用var关键字定义时就是必需的了。原因是C#编译器需要从表达式右边推测变量的类型 - 只是简单地在编译时看看代码准备赋给变量的值是什么类型,然后把var关键字替换为相应的类型名称。
这表明使用var关键字不会给程序运行造成额外开销 - 与使用明确变量类型定义时的运行速度是一样的,因为.NET framework实际运行该代码时已经变成了明确类型的变量定义。
第一个例子似乎显得微不足道 - 用“var”替代“string”并没有节省多少编程时间。不过,有时会需要很多复杂的类型,不论是新变量还是作为从一个方法(用户定义的或来自.NET framework的)中取得的本地值。在以下的示例中就可能会省下不少键盘输入工作:
Dictionary<int, List<string>> dict1 = new Dictionary<int, List<string>>();
var dict2 = new Dictionary<int, List<string>>();
两种定义的结果是完全一样的,但后一种方法显然就不用敲那么多次键盘,而由于在两种方法中都在表达右边明确了变量类型,使用var关键字并没有让代码的可读性降低多少。
在定义一个接收方法调用结果的本地变量时也可以使用var关键字:
var s = DateTime.Now.ToString();
这同样的节省时间且没有岐义,变量的类型很明确(此处就是string)。但下面的例子就不同了:
var myVar = SomeMethodWithANameWhichDoesntIndicateTheReturnType();象这种情况,就完全不清楚变量的类型是什么,代码的可读性可能就被牺牲掉了。此时就该明确变量的类型。
var关键字与匿名类型
目前为止,所用的示例都演示的是var关键字在方便书写语法上的应用 - 便于使用和理解,但并非强制的。不过,使用匿名类型(后续章节会介绍)时,使用var关键字来定义对象就很有意义了:
var myObj = new
{
Name = "John Doe",
Age = 42
};
Console.WriteLine(myObj.Name);在此例子中,要想访问匿名类型的字段,就需要使用var关键字。
总结
var关键字允许定义本地变量(在方法或循环内部)时不用明确具体变量类型 - 而是由C#编译器从定义表达式的右边推导出变量的类型。很多情况下这会很方便,但也可能会稍微降低代码的可读性。用不用都可以,坚持明确定义变量的类型也没关系 - 程序员自己方便就好,但是,如前面例子所示,对匿名类型,那就真的需要了。