2. Implicitly Typed Local Variables(隐式类型)与Implicitly Typed Array(隐式类型数组)
写过JavaScript的朋友或许早就一眼盯住了上文中提到的新关键字“var”,是啊,多么熟悉的字眼儿,如今竟然也在C#当中出现了!如何使用呢?让我们来看一段很简短的代码吧:
1: static void Main(string[] args)
2: {
3: var name = "ZeroCool";
4: var age = 24;
5:
6: Console.WriteLine(name + " is " + age + " years old.");
7: }
如果您是在C# 3.0中编写这段代码,那么就可以运行。也许您会问,用var有什么好处呢,是否object也可以代替它呢?是的,可以代替,object是基类型,当然可以用它来声明任何类型的变量。但是,如果用object来声明值类型就会引起装箱操作,这会降低性能。另外,如果您要用几个object声明的变量进行运算的话,您必须得把它们挨个转换成相应的类型才行,这样做其实是费力不讨好的。关键字var的优点就在于它使得您可以非常便利地声明隐式类型变量,编译器可以在用到该变量的时候根据它的值来反推出它的类型。注意,var并不是具体的变量类型,它只是一个声明符,它的作用就是将数据类型的声明交给编译器去做。您可以用它来声明任何类型的变量,正如上一段程序中的变量age,您肯定知道它是一个int型变量,但实际上您写下这句代码的时候它还不是,只有在编译的时候编译器根据它的值反推出它是int型时,它才是真正意义上的int型。
前面看到的是用var关键字声明一些简单类型的变量,那么复杂类型的变量例如数组、集合等,是否也可以使用var关键字呢?答案是肯定的,请看:
1: static void Main(string[] args)
2: {
3: var memberNames = new[] { "ZeroCool", "Michael", "Somebody" };
4:
5: foreach (var item in memberNames)
6: {
7: Console.WriteLine(item.ToString());
8: }
9:
10: Console.ReadLine();
11: }
上面这段代码是可以正常运行的,同样的,.NET为我们提供的其它类型我们都可以用var来声明,同时也包括用户自定义类型。
另外,更强大的一点是,隐式类型数组中的元素可以通过匿名对象初始器来创建匿名类型的数据结构,例如:
1: static void Main(string[] args)
2: {
3: var memberInfo = new[] {
4: {
5: Name = "ZeroCool",
6: Details = new[] { "ZeroCool@Autumoon.com", "China" }
7: },
8: {
9: Name = "Michael",
10: Details = new[] { "Michael@Mail.com", "China", "Programmer" }
11: }
12: };
13: }
但是在使用var关键字声明变量的时候有几点注意事项:
- 声明变量时必须初始化;
- 错误:var name;
- 初始器必须是一个表达式;
- 错误:var names = {"ZeroCool", "Autumoon"};
- 初始器表达式必须是一个不为null类型的编译时类型;
- 错误:var name = null;
- 局部变量的声明中不能包含多个声明符;
- 错误:var name = "ZeroCool", country = "China";
- 初始器不能使用被声明变量自身;
- 错误:var name = name + " A";
- 隐式类型数组在声明时必须确保数组内部成员的类型唯一;
- 错误:var names = new[] {"ZeroCool", 123};
隐式类型的内容比较简单,使用起来也非常简便,我们先介绍到这里,接下来将是Extension Methods(扩展方法),欲知后事如何,且听下回分解!