• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

从LINQ的角度看待C#3.0的新功能

发布: 2008-5-07 14:34 | 作者: 网络转载 | 来源: 本站原创 | 查看: 80次 | 进入软件测试论坛讨论

领测软件测试网

 


 

coffees = ["French Roast", "Columbian", "Kona"];//这不是初始化,而是赋值。

  对象初始化表达式是语言集成查询的一个重要功能,因为它们允许在仅允许表达式的上下文(如 λ 表达式和表达式树)中生成新的结构化值。
5. Anonymous types

  C# 3.0 permits the new operator to be used with an anonymous object initializer to create an object of an anonymous type.

霍霍,implicitly typed local variables + object initializer = anonymous types!

  LINQ 项目支持以数据为中心的编程样式,其中,某些类型的存在主要是为了通过结构化值提供静态“形式”,而不是提供同时具有状态和行为的完整对象。……匿名类型允许将新的结构定义为与它们的初始化进行“内联”。
  6. Implicitly typed arrays

  The syntax of array creation expressions (§7.5.10.2) is extended to support implicitly typed array creation expressions.

implicitly typed local variables + collection initializer = Implicitly typed arrays
  7. Query expressions

  Query expressions provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.

  The C# 3.0 language does not specify the exact execution semantics of query expressions. Rather, C# 3.0 translates query expressions into invocations of methods that adhere to the query expression pattern. Specifically, query expressions are translated into invocations of methods named Where, Select, SelectMany, Join, GroupJoin, OrderBy, OrderByDescending, ThenBy, ThenByDescending, GroupBy, and Cast that are expected to have particular signatures and result types.

  C#引入了很多语言构造来支持特定的操作。比如foreach语句、using语句等,在支持函数回调的语言中,这些语句的功能都可以用函数来模拟,C++ STL中就有for_each函数。

  C#3.0的Query expressions应该也是这类语言构造。乍一看,貌似可以在C#中写类似SQL的查询语句来从对象中提取信息了——把查询语句写在字符串中并不稀奇,C#3.0的厉害之处在于,它把查询语句提升为语言级别的构造。至于实现原理,似乎与C语言的宏有神似之处,编译器在类型绑定和重载决策之前,把查询表达式翻译为相应的方法调用。比如下面的查询表达式

from c in customers group c by c.Country into g select new { Country = g.Key, CustCount = g.Count() }

  将被翻译为

customers. GroupBy(c => c.Country). Select(g => new { Country = g.Key, CustCount = g.Count() })

  显然,为了支持查询表达式,customers所在的类型必须包含GroupBy,Select等方法(pzy:这种方法称为“查询操作符”,引入扩展方法的主要意图就是让用户可以定义查询操作符。)的定义。

  从查询表达式到方法调用的翻译,是在语法层面上,于是我感觉,之前的一堆功能,动机都是简化、统一、兼容语法,它们在一定程度上是为查询表达式服务的。比如扩展方法,就是为了能够以与实例方法相同的语法调用在其它类中定义的静态方法。

  与 foreach 语句一样,查询语法是一个方便的声明性代码缩写,您可以手动编写它。
  8. Expression trees

  Expression trees permit lambda expressions to be represented as data structures instead of executable code.

  把代码封装为数据?还没领会它的真正意图是什么,好像也是为查询表达式服务的。

  λ 表达式的优点是,能够提供最直接而简洁的创作语法。更重要的是,λ 表达式可以编译为代码,也可以编译为数据,从而允许优化器、转换器和计算器在运行时处理 λ 表达式。表达式树是 λ 表达式的有效内存中数据表示形式,它使表达式的结构透明且显式。


编译器是发出可执行 IL 还是表达式树取决于 λ 表达式的用法。如果将 λ 表达式指定给委托类型的变量、字段或参数,则编译器将发出与匿名方法等效的 IL。如果将 λ 表达式指定给 Expression 类型的变量、字段或参数,则编译器将发出表达式树。

例如,请考虑以下两个变量声明:

Func f = n => n < 5; Expression e = n => n < 5;

  变量 f 是对委托的引用,可以直接执行:

bool isSmall = f(2); // isSmall is now true

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

32/3<123>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网