【已更新最新开发文章,点击查看详细】
从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var。 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型一样。 i 的以下两个声明在功能上是等效的:
var i = 10; // 隐式类型 int i = 10; // 显式类型
请注意,在示例 #2 中,foreach 迭代变量 item 必须也为隐式类型。
// 示例 #1: 当 select 子句指定字符串时,var是可选的 string[] words = { "apple", "strawberry", "grape", "peach", "banana" }; var wordQuery = from word in words where word[0] == 'g' select word; // 因为序列中的每个元素都是字符串,而不是匿名类型,所以var在这里也是可选的。 foreach (string s in wordQuery) { Console.WriteLine(s); } // 示例 #2: var 是必需的,因为select子句指定匿名类型 var custQuery = from cust in customers where cust.City == "Phoenix" select new { cust.Name, cust.Phone }; // 必须使用var,因为序列中的每个项都是匿名类型 foreach (var item in custQuery) { Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone); }
隐式类型本地变量
隐式类型化数组。
以下示例演示使用 var 声明局部变量的各种方式:
// i 被编译成 int 类型 var i = 5; // s 被编译成 string 类型 var s = "Hello"; // a 被编译成 int[] 数组 var a = new[] { 0, 1, 2 }; // expr 被编译成 IEnumerable<Customer> 或者 IQueryable<Customer> 类型 var expr = from c in customers where c.City == "London" select c; // anon 被编译成匿名类型 var anon = new { Name = "Terry", Age = 34 }; // list 被编译成 List<int> 集合 var list = new List<int>();
它只表示由编译器确定并分配最适合的类型。
在以下上下文中,可使用 var 关键字:
-
在局部变量(在方法范围内声明的变量)上,如前面的示例所示。
-
for 初始化语句中
for(var x = 1; x < 10; x++)
- 在 foreach 初始化语句中
foreach(var item in list){...}
- 在 using 域间中
using (var file = new StreamReader("C:\\myfile.txt")) {...}
有关详细信息,请参阅如何:在查询表达式中使用隐式类型本地变量和数组。
var 和匿名类型
匿名类型。
因此,如果使用 var 初始化了查询变量,则访问返回对象序列中的属性的唯一方法是在 foreach 语句中将 var 用作迭代变量的类型。
class ImplicitlyTypedLocals2 { static void Main() { string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" }; // 如果查询生成一系列匿名类型,则在foreach语句中使用var访问属性。 var upperLowerWords = from w in words select new { Upper = w.ToUpper(), Lower = w.ToLower() }; // 执行查询 foreach (var ul in upperLowerWords) { Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower); } } } /* 输出: Uppercase: APPLE, Lowercase: apple Uppercase: BLUEBERRY, Lowercase: blueberry Uppercase: CHERRY, Lowercase: cherry */
特别说明
以下限制适用于隐式类型化变量声明:
-
仅当局部变量在相同语句中进行声明和初始化时,才能使用
var;变量不能初始化为 null,也不能初始化为方法组或匿名函数。 -
var不能在类范围内对字段使用。 -
换句话说,此表达式是合法的
: int i = (i = 20);,但是此表达式会生成编译时错误:var i = (i = 20); -
不能在相同语句中初始化多个隐式类型化变量。
-
如果一种名为
var的类型处于范围内,则var关键字会解析为该类型名称,不会被视为隐式类型化局部变量声明的一部分。
考虑下列代码:
private var bookTitles;
此外,向该字段添加表达式(就像对本地变量执行的操作一样)也是不够的:
private var bookTitles = new List<string>();
编译器在尝试分析 bookTitles 时遇到相同的悖论:它需要知道字段的类型,但编译器通常会通过分析表达式来确定 var 的类型,这在事先不知道类型的情况下无法实现。
这可能会针对分组和排序操作发生。
只要你和必须维护你的代码的其他人了解这一点,使用隐式类型化实现便利性和简便性时便不会出现问题。
// 与前面的示例相同,只是我们使用整个姓氏作为键。 // 查询变量是IEnumerable<igrouping<string,student>> var studentQuery3 = from student in students group student by student.Last;
为此,C# 文档通常只在需要时才使用 var。
其他技术请参阅
- C# 参考
- 隐式类型化数组
- 如何:在查询表达式中使用隐式类型本地变量和数组
- 匿名类型
- 对象和集合初始值设定项
- var
- LINQ 查询表达式
- LINQ(语言集成查询)
- for
- foreach, in
- using 语句
【已更新最新开发文章,点击查看详细】