频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

LINQ的演变及其对C#设计的影响(3)

作者: Anson Horton 出处:天极软件 2007-08-20 14:04    砖    好    评论   进入论坛
阅读提示:LINQ是支持以类型安全方式查询数据的一系列语言扩展;它将在代号为“Orcas”的下一个版本Visual Studio中发布。待查询数据的形式可以是XML(LINQ到XML)、数据库(启用LINQ的ADO.NET,其中包括LINQ到SQL、LINQ到Dataset和LINQ到Entities)和对象(LINQ到Objects)等。在没有任何语言扩展的情况下,该查询在C# 2.0中又会是什么样子?

匿名类型

如果我们想继续使用我们现有的语法来返回名称和地址,我们很快便会面临问题,即不存在仅包含Name和Address的类型。虽然我们仍然可以编写此查询,但是必须引入该类型:

class CustomerTuple
{
 public string Name;
 public string Address;
 public CustomerTuple(string name, string address)
 {
this.Name = name;
this.Address = address;
 }
}

然后我们才能使用该类型,即此处的CustomerTuple,以生成我们查询的结果。

IEnumerable locals =customers.Where(c => c.ZipCode == 91822).Select(c => 
   new CustomerTuple(c.Name, c.Address));

那确实像许多用于投影出字段子集的样板代码。而且还往往不清楚如何命名此种类型。CustomerTuple确实是个好名称吗?如果投影出Name和Age又该如何命名?那也可以叫做CustomerTuple。因此,问题在于我们拥有样板代码,而且似乎无法为我们创建的类型找到任何恰当的名称。此外,还可能需要许多不同的类型,如何管理这些类型很快便可能成为一个棘手的问题。

这正是匿名类型要解决的问题。此功能主要允许在无需指定名称的情况下创建结构化类型。如果我们使用匿名类型重新编写上述查询,其代码如下所示:

locals = customers.Where(c => c.ZipCode == 91822)
 .Select(c => new { c.Name, c.Address });

此代码会隐式创建一个具有Name和Address字段的类型:

class
{
 public string Name;
 public string Address;
}

此类型不能通过名称引用,因为它没有名称。创建匿名类型时,可显式声明字段的名称。例如,如果正在创建的字段派生于一条复杂的表达式,或纯粹不需要名称,就可以更改名称:

locals = customers.Where(c => c.ZipCode == 91822)
.Select(c => new { FullName = c.FirstName + “ “ + c.LastName,
HomeAddress = c.Address });

在此情形下,生成的类型具有名为FullName和HomeAddress的字段。

这样我们又向理想世界前进了一步,但仍存在一个问题。您将发现,我在任何使用匿名类型的地方都策略性地省略了局部变量的类型。显然我们不能声明匿名类型的名称,那我们如何使用它们?

隐式类型化部变量

还有另一种语言功能被称为隐式类型化局部变量(或简称为var),它负责指示编译器推断局部变量的类型。例如:

var integer = 1;

在此例中,整数具有int类型。请务必明白,这仍然是强类型。在动态语言中,整数的类型可在以后更改。为说明这一点,以下代码不会成功编译:

var integer = 1;
integer = “hello”;

C#编译器将报告第二行的错误,表明无法将字符串隐式转换为int。

在上述查询示例中,我们现在可以编写完整的赋值,如下所示:

var locals =
customers
.Where(c => c.ZipCode == 91822)
.Select(c => new { FullName = c.FirstName + “ “ + c.LastName,
HomeAddress = c.Address });

局部变量的类型最终成为IEnumerable<?>,其中“?”是无法编写的类型的名称(因为它是匿名的)。

隐式类型化局部变量只是:方法内部的局部变量。它们无法超出方法、属性、索引器或其他块的边界,因为该类型无法显式声明,而且“var”对于字段或参数类型而言是非法的。

事实证明,隐式类型化局部变量在查询的环境之外非常便利。例如,它有助于简化复杂的通用实例化:

var customerListLookup = new Dictionary<STRING, ListCustomer>();

现在我们的查询取得了良好进展;我们已经接近理想的语法,而且我们是用通用语言功能来达成的。

有趣的是,我们发现,随着越来越多的人使用过此语法,经常会出现允许投影超越方法边界的需求。如我们以前所看到的,这是可能的,只要从Select内部调用对象的构造函数来构建对象即可。但是,如果没有用来准确接受您需要设置的值的构造函数,会发生什么呢?


共4页: 上一页 [1] [2] 3 [4] 下一页
【内容导航】
关于 LINQ  演变  C#  Orcas
专题
C#实用基础教程
C#技术开发指南
初探敏捷开发
WCF开发基础
体验Visual Studio 2008的魅力
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。