博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《圣殿祭司的ASP.NET4.0专家技术手册》---- 2-7 隐含类型局部变量及数组声明
阅读量:5880 次
发布时间:2019-06-19

本文共 3719 字,大约阅读时间需要 12 分钟。

本节书摘来自异步社区《圣殿祭司的ASP.NET4.0专家技术手册》一书中的第2章,第7节,作者: 奚江华,译者: 武海军 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

2-7 隐含类型局部变量及数组声明

圣殿祭司的ASP.NET4.0专家技术手册

以var声明的类型,叫做“隐含类型声明”,像传统JavaScrip一样以var声明变量或对象。

2-7-1 初探var隐含类型声明

以下用var隐含类型声明数值及字符串的方式:

var age=30 ;   //声明年龄为30,为number数值型态var name="Kevin";  //声明名字为Kevin,为string字符串型态

var隐含类型声明创造的最大目的是,为了配合LINQ查询语法与匿名类型(Anonymous Type)的特性,因为很多时候在声明LINQ查询匿名类型时,使用var关键字来声明类型,可让语法变得十分精简,而不必为了类型的指定而花太多力气。

var隐含类型声明常应用在:①隐含类型局部变量、②隐含类型数组、③匿名类型对象,如图2-4所示,后续将详述这3种应用。

fc5e2bed8bd16a758851ccd5770c14339e14e149

附注 当然隐含类型可接受的类型还更多,在这仅介绍比较常用的,在2-6-5小节列出其他隐含类型。

2-7-2 隐含类型局部变量

隐含类型局部变量(Implicitly Typed Local Variables),顾名思义,就是利用var在一个区域(指方法)中声明隐含类型的变量。

范例2-2 基本var隐含类型局部变量声明

在此以var关键字声明隐含类型局部变量,并进行加法运算,请参考VarVarible.aspx程序:

71d448f8828429fd205d14716a2908814ce35c06

程序说明

a+b运算的结果是15。但勿将var的声明语法搬到.NET 1.0或2.0环境中使用,因为不支持。

2-7-3 隐含类型数组

var除了声明局部变量外,也可用来声明隐含类型数组(Implicitly Typed Arrays)。隐含类型数组是通过new[]关键字来声明。以下说明传统数组与隐含类型数组语法上的差异。

1.int类型数组语法

以下为传统int类型数组与隐含类型数组的差异,其中隐含类型数组声明,完全不需指定int类型,而其类型是由数组元素(Element)推断而来(编译器会进行类型推论与判断)。

程序:ArraySample.aspx 隐含类型数组声明//第1种语法声明,传统int数组int[] arrayInt1 = new int[5] { 100, 200, 300, 400, 500 };//第2种语法声明,传统int数组int[] arrayInt2 = new int[] { 100, 200, 300, 400, 500 };//第3种语法声明,传统int数组int[] arrayInt3 = { 100, 200, 300, 400, 500 };//第4种语法声明,传统int数组int[] arrayInt4 = new int[5];arrayInt4[0] = 100;arrayInt4[1] = 200;arrayInt4[2] = 300;arrayInt4[3] = 400;arrayInt4[4] = 500;//隐含类型数组(int)var ImplicityArrayInt = new[] { 100, 200, 300, 400, 500 };

2.string类型数组语法

以下为传统string类型数组与隐含类型数组的差异。

程序:ArraySample.aspx 隐含类型数组声明

6705a32b4a11c804c7710a12f2d3ef6b4902af60

3.不规则数组语法

以下为传统int类型不规则数组与隐含类型不规则数组的差异。

程序:ArraySample.aspx 隐含类型数组声明

7b1c954badfd5deb4aa8cf3b20b37c7820d0a3ba

范例2-3 隐含类型数组的定义与LINQ查询运用

前面var程序中,隐含类型数组在声明上没有太大难处,但其实查询与运用才是重点,因此,在此要探讨隐含类型数组与传统语法在查询上的差异,且使用LINQ来查询数组的数据。在此以汽车销售为例,请参考ImpilicityArray.aspx程序:

4c3da393f2e158d3fcdf5399bf2d0cd3cf8587f1

程序说明

..ICONN01.tif 若是单纯对数组内容的读取,可使用传统的for,若以var声明的LINQ查询表达式,则可用foreach来读取。

..ICONN02.tif 至于foreach中,类型的声明可用var或int明确类型。

..ICONN03.tif 隐含类型数组声明好之后,可用LINQ进行查询(选择性,非必要),进行条件的筛选。

程序的执行结果如图2-5所示。

4202c31d509769f225a0adc6436bea7784656b97

1级提醒

 隐含类型只支持一维的数组,不支持多维的。

2-7-4 var隐含类型局部变量与匿名类型的搭配运用

当使用匿名类型对象时,有很高的几率搭配var隐含类型,因为匿名类型对象只能指定给var所声明隐含类型。var创造的最大的目的是,为了配合匿名类型语法。

范例2-4 匿名类型搭配var隐含类型声明

以下匿名类型中是个人基本数据,然后再赋值给var隐含类型的person对象,请参考VarAnonymous.aspx程序:

e42dfdac4756da818e66e0b7e86bddb676459293

程序说明

..ICONN01.tif 第3行程序中以var声明了一个匿名类型对象,里面同时包含了string字符串与int数值,请问我们该叫person为什么类型呢?

..ICONN02.tif 若C# 3.0不发明“var”隐含类型声明,坦白讲person这样的匿名类型对象根本无法直接用一种类型对应。

..ICONN03.tif 但就算var属于隐含类型声明,也不表示所声明的对象或变量没有类型,只是无法刻意用一个确定类型名称来描述它,故统称匿名类型。

..ICONN04.tif 程序在编译时,会为person这个Anonymous Type对象私下取一个名字,叫做“<>f__AnonymousType0'3[System.String, System.Int32,System.Int32]”,它的名字中带有AnonymousType字眼,而且类型确定的强类型对象,而不是没有名字、没有类型的未知对象,用GetType()方法就能查知。有点像老子《道德经》中所说:“道本无名,强名曰道”的意思,系统很清楚这个对象名字与类型,但不好用人类懂的术语来讲(如string或int),但人类又强要个名字,故只好弄个假名“AnonymousType”,好让你不再困惑。

程序执行结果如图2-6所示。

6fe1f77deb03e5843e4829c1920972f77417b2e1

2-7-5 var隐含类型声明的特性与限制

但var隐含类型的本质,完全不是JavaScript的var变量声明那回事,若你以为两者是同一特性就大错特错了。C# 3.0只不过借用var避开了一开始某些类型声明上的困难,以增加灵活性,但骨子里却仍然是静态语言及强类型的坚持者,和JavaScript的var声明完全不同,以下是说明:

类型确定时期:var在编译时就确定了类型,但JavaScript要在运行时才会知道类型,这对程序质量与稳定性有很大影响。

类型推论:以var所声明的变量或数组,其类型之所以能确定,是因为var会指示编译器去推论变量或对象正确类型,而推论的基础在于“=”等号右方的表示式类型,例如,var a=123,则编译器就会将a视为int类型,若var a=“Kevin”,自然a就是string类型了。
类型变更限制:从.NET 1.0开始,一旦声明类型后,类型就无法在运行时任意更换,即使使用了var声明,但编译后的类型早已确定,运行时一样不允许更换类型,例如,声明了var a =123,a就是int类型,不能再动态指定a =“kevin”,编译程序会警告错误;但JavaScript以var声明的变量类型,可以在运行时任意改变类型,没有限制。
类型:var能接受或声明的类型有.NET Framework系统内建类型、.NET Framework Class Library中定义的类型、Anonymous Type类型、用户自定义类型(user-defined)或其他任何的表示式。
与LINQ搭配:LINQ查询常会搭配var声明。
1.var声明使用范围

使用“var”关键字声明变量或对象,范围是有限制的:

只能在方法层级中使用,声明局部变量,不能在类层级中声明为全局变量;

在for的语句中使用,如for(var x = 0; x < 50; x++){…};
在foreach的语句中使用,如foreach(var item in list){...};
using (var file = new StreamReader("C:myfile.txt")) {...}。
2.var声明错误示范

以下var为不合法的例子。

程序:VarClass.cs var不合法声明例子

dfa306782e82c223f0a536adb3d3cc0420fc40c8

程序说明

所以看到var种种限制后,应能了解var的运用倾向于配合C# 3.0新语法功能的灵活性运用,而不是用来全面替代明确类型的声明。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

你可能感兴趣的文章
iOS UITableView表视图滚动隐藏UINavigationController导航栏
查看>>
SDL如何嵌入到QT中?!
查看>>
$(document).ready()
查看>>
RunLoop总结:RunLoop的应用场景(四)
查看>>
8个很实用的在线工具来提高你的Web设计和开发能力
查看>>
P1026 统计单词个数
查看>>
AndroidStudio EventBus报错解决方法its super classes have no public methods with the @Subscribe...
查看>>
Python RGB 和HSV颜色相互转换
查看>>
mybatis分页练手
查看>>
.net数据库连接字符串加密
查看>>
[js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
查看>>
文件监控
查看>>
poi excel 常用api
查看>>
AD提高动态的方法(附SNR计算)
查看>>
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>
EntityFramework中使用Include可能带来的问题
查看>>
activity 用 service 更新界面
查看>>
我的时间管理——充分利用WindowsPhone、Android等设备,实现真正的无压工作!
查看>>