c#

位置:IT落伍者 >> c# >> 浏览文章

.NET中容易混淆的几组重要概念


发布日期:2021年12月08日
 
.NET中容易混淆的几组重要概念

许多朋友在学习和开发NET程序的过程中经常发现一些误用NET概念的情况本文将对AJAXLINQLambda等相关的概念进行梳理希望在明确这些概念之后大家能够把注意力集中在对于具体问题的分析解决上而不要让沟通成为瓶颈

在这篇文章中希望澄清三组概念它们是

◆AJAX / AJAX框架 / AJAXNET (Professional) / ASPNET AJAX

◆LINQ / LINQ to SQL / LINQ to XXX

◆Lambda Expression / Expression Tree / 匿名方法

AJAX / AJAX框架 / AJAXNET (Professional) / ASPNET AJAX

这是我见过的混淆最多的一组概念不过当去年AJAX技术如火如荼AJAX框架层出不穷而微软又推出ASPNET AJAX框架之后这四个概念之间的混淆也愈发严重起来了我经常能看到这样的问题

◆我在用AJAX技术时不知道怎么在UpdatePanel里……

◆我用AJAXNET框架调用Web Service时……

这是非常典型的概念混淆上面两句话的AJAX与AJAXNET都应该使用ASPNET AJAX替换关于这几个概念的区别我《深入浅出ASPNET AJAX》系列WebCast多次进行解释不过收效似乎并不明显于是我打算在这里再进行一下说明

AJAX是Asynchronous JavaScript and XML缩写这个概念代表的是一种技术当您在说我在项目中使用了AJAX技术时只是代表了您使用客户端XMLHttpRequest对象与服务器端进行异步通信不过因为随着AJAX技术的运用往往会带来丰富的客户端效果因此对AJAX技术的广义理解也可以认为这是一种操作客户端DOM而带来丰富效果的技术(这个广义的描述其实并不准确大家明白老赵的意思就可以了)

AJAX框架是一套辅助开发人员使用AJAX技术的代码包(库etc一个AJAX框架的目的一般是对XMLHttpRequest对象的使用进行封装并提供一些操作DOM元素或者实现特殊效果的捷径成熟的AJAX框架有很多它们可以被分为以客户端为中心面向特定服务器技术两大类前者的优秀代表有(排名不分先后)PrototypejQueryMootoolsYUIDojo等等(最后两个其实更接近一套客户端界面库也就是广义的AJAX框架)而后者的典型代表既是AJAXNET和ASPNET AJAX了——当然也有优秀的AJAX框架面向其他服务器技术在此不提

AJAXNET (Professional)是ASPNET平台上着名的AJAX框架诞生于月(虽然正式命名为AJAXNET则是在两个月之后)作者为Michael Schwarz

同年Michael为AJAXNET提供了更丰富的功能(主要是安全性方面)并将其改名为AJAXNET ProfessionalAJAXNET提供的最主要的(也是唯一)的功能就是异步调用服务器端方法可谓非常纯粹的基于数据的AJAX使用方式这个框架是一个个人作品有支持NET 的版本它并不属于微软官方目前已经停止更新

ASPNET AJAX的Code Name为Atlas在CTP向Beta版转移时曾经发生过翻天覆地的变化ASPNET AJAX中包含了UpdatePanel等控件可以非常透明地为现有的ASPNET WebForms应用程序添加AJAX效果此外还提供了客户端异步调用Web Services的方法使开发人员也能够使用面向数据的方式使用AJAX技术值得一提的是ASPNET AJAX的附属品相当丰富例如ASPNET AJAX名为Microsoft AJAX Library的客户端部分是一个纯客户端AJAX框架提供了面向对象类型系统浏览器兼容层异步通信层等多种基础组件ASPNET AJAX的开源扩展包AJAX Control Toolkit包含了数十个可以直接使用的AJAX服务器端控件这样开发人员能够轻松地添加丰富的客户端效果同时官方还为ASPNET AJAX提供了非正式地扩展包其中的History等优秀控件也将加入未来版本的ASPNET AJAX框架中ASPNET AJAX是官方出品的AJAX框架目前已经被集成到ASPNET 中去了因此其版本号也从ASPNET AJAX 一下子跃升为ASPNET AJAX 如果您看到了这些版本号也请不要疑惑其实ASPNET AJAX 相对于ASPNET AJAX 来说只是修补了一些细小bug几乎没有任何变化

LINQ / LINQ to SQL / LINQ to XXX

LINQ是新生事物不过从不少文章和讨论上看来这方面的概念也已经有点混沌不清了因此我们经常可以看到这样的话

◆LINQ只能将数据表与实体属性一一对应……

◆LINQ开发指南在LINQ中进行数据库字段映射……

以上两句话其实说的都是LINQ to SQL而不是指LINQ可能由于LINQ to SQL的上镜率最广(连MSDN上About LINQ的第一个示例就是查询数据库的)因此许多人都将LINQ to SQL与LINQ混用这会给初学者造成误解认为LINQ就是LINQ to SQLLINQ to SQL就是LINQ——事实当然不是这样的

LINQ是LanguageIntegrated Query的缩写是C# 和VB 中新加入的语言特性可以在编程时使用内置的查询语言进行基于集合的操作这么做可以大大简化开发过程提高开发效率例如

List userList = GetUserList();

var userWithOddId = from u in userList

where uUserID % ==

select u;

foreach (User u in userWithOddId)

{

ConsoleWriteLine(uUserName);

}

如果没有LINQ要筛选出ID为奇数的User对象则需要创建一个List然后遍历整个列表将符合特定条件的User对象放入新列表而有了LINQ这部分的筛选就变得非常容易

甚至只需要一句话就能完成如果觉得这个例子不够说明LINQ对生产力有重大贡献的话请关注我接下来的一篇文章(暂定名为《我们为什么要拥抱LINQ》)LINQ特指形如上面这段代码中fromwhereselect这样的用法其返回值是IQueryable或IEnumerable

LINQ to SQL是NET 内置的一个轻量级O/R Mapping解决方案可以将数据表映射为实体对象方便开发人员对数据库的操作可见LINQ to SQL实只是LINQ的一个实现提供了一个可以查询SQL Server数据库的LINQ Provider

LINQ Provider是LINQ查询的执行器标准LINQ语法支持许多的操作符但是某个具体的LINQ实现可能只支持其中的一部分NET 默认提供了三种LINQ Provider分别是LINQ to Object(即上面的例子)LINQ to SQL以及LINQ to XML

LINQ to XXX表示使用LINQ针对XXX这种数据进行查询的解决方案我们可以自定义LINQ Provider使用我们自定义的查询规则来处理特定数据集目前互联网上已经可以找到数十种LINQ Provider(如LINQ to FlickrLINQ to NHibernate等)而已经处于beta 阶段的ADONET Entity Framework最终也会提供一个LINQ Provider叫做LINQ to Entities

上一篇:关于.NET髒字过滤的算法代码

下一篇:C#3.0新体验之匿名函数