C# 8.0本质论
上QQ阅读APP看书,第一时间看更新

3.3 隐式类型的局部变量

C# 3.0新增上下文关键字var来声明隐式类型的局部变量。声明变量时,如果能用确定类型的表达式初始化它,C# 3.0及以后的版本就允许变量的数据类型为“隐式的”,无须显式声明,如代码清单3.4所示。

代码清单3.4 字符串处理

上述代码清单和代码清单2.18相比有两处不同。首先,不显式声明为string类型,而是声明为var。最终的CIL代码没有区别。但var告诉编译器根据声明时所赋的值(System.Console.ReadLine())来推断数据类型。

其次,text和uppercase变量都在声明时初始化。不这样做会造成编译时错误。如前所述,编译器判断初始化表达式的数据类型并相应地声明变量,就好像程序员显式指定了类型。

虽然允许用var取代显式数据类型,但在数据类型不是很明显的情况下最好不要用var。例如,还是应该将text和uppercase声明为string。这不仅可使代码更易理解,还相当于你亲自确认了等号右侧表达式返回的是你希望的数据类型。使用var变量时,右侧数据类型应显而易见,否则应避免用var声明变量。

设计规范

·避免使用隐式类型的局部变量,除非所赋的值的数据类型显而易见。

语言对比:C++/Visual Basic/JavaScript——void*、Variant和var

隐式类型的变量不等价于C++的void*、Visual Basic的Variant或JavaScript的var。这三种情况的变量声明都不严格,因为可将一个不同的类型重新赋给这些变量,这类似于在C#中将变量声明为object类型。相反,C#的var由编译器严格确定类型,确定了就不能变。另外,类型检查和成员调用都会在编译时进行验证。

高级主题:匿名类型

C# 3.0添加var的真正目的是支持匿名类型。匿名类型是在方法内部动态声明的数据类型,而不是通过显式的类定义来声明,如代码清单3.5所示。(第15章会深入讨论匿名类型。)

代码清单3.5 使用匿名类型声明隐式局部变量

输出3.1展示了结果。

输出3.1

代码清单3.5演示了如何将匿名类型的值赋给隐式类型(var)局部变量。C# 3.0支持连接(关联)数据类型或将特定类型的大小缩减至更少数据元素,所以才配合设计了这种操作。但自从C# 7.0引入元组语法后,匿名类型几乎就用不着了。