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

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

C#3.0与LINQ新特性简介

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

领测软件测试网

 

现在,使用对象初始化,就可以像这样子来重写:

Point p = new Point() { X = 0, Y = 0 };

  这个特性也可以使用在集合上,看看下面这段示例:

List points = new List { new Point { X = 2, Y = 5 }, new Point { X = 1, Y = -10 }, new Point { X = 3, Y = 0 } };

  注意,编译器会产生和上面相等价的长一些的代码,它依次调用Add()方法来在集合里添加元素。

  IV/ 匿名类型

  这个语言特性让我们可以定义内嵌的类型,而不需要显式地定义一个类型。换句话说,假设我们没有定义Point类,却要使用一个Point对象(即类型是匿名的)。我们可以使用上面提到的对象初始化语法,但不用指定类型名:

var p = new {X = 0, Y = 2};

  在VS2008中,你仍然可以使用智能感应。所以如果你继续使用变量p,就会得到这个匿名类型的属性列表。

  V/ Lambda表达式

  在C#2.0 中引入了匿名方法,允许在需要委托的地方写一个代码块。匿名方法提供了函数式程序语言的能力,语法显得很简洁。Lambda表达式提供了一个更简洁的语法来写匿名方法。一个Lambda表达式就是一个参数列表(可以隐式类型),然后是一个=>符号,然后是一个表达式或者一个语句块。

  作为一个示例,我们定义一个委托类型MyDeleg:

delegate R MyDeleg(A arg);

  然后我们就可以使用匿名方法:

MyDeleg<int,bool> IsPositive = delegate(int num) { return num > 0; };

  我们也可以使用新的Lambda表达式来写:

MyDeleg<int,bool> IsPositive = num => num > 0;

  VI/ 扩展方法

  扩展方法可以使你来扩展一个已存在的类型,增加它的方法,而无需继承它或者重新编译。所以不像为对象写助手方法,扩展方法可以直接是对象自己的一部分。

  一个示例,假设我们想要验证一个string是不是合法的Email地址,我们可以编写一个方法,输入为一个string并且返回true或者false。现在,使用扩展方法,我们可以如下这样做:

public static class MyExtensions { public static bool IsValidEmailAddress(this string s) { Regex regex = new Regex( @"^[w-.]+@([w-]+.)+[w-]{2,4}$" ); return regex.IsMatch(s); } }

  我们定义了一个带有静态方法的静态类。注意,那个静态方法在参数类型string前面有一个this关键词,这会告诉编译器这个特殊的扩展方法会增加给string类型的对象。于是我们就可以在string中调用这个成员方法:

using MyExtensions; string email = Request.QueryString["email"]; if ( email.IsValidEmailAddress() ) { // }

  值得提出的是,LINQ就是使用了System.Linq命名空间中的扩展方法(比如where()、orderby()、select()、sum()、average()等等),而且它定义了标准查询操作符,可以用来查询关系数据库、XML和任何实现了IEnumerable<T>接口的.NET对象。

  VII/ 查询语法

  查询表达式提供了一个语言集成的语法来查询,它特别像关系和层次查询语言比如SQL和XQuery。使用LINQ操作符(也就是from...where...select)写查询很方便,Visual Studio为它提供了很好的智能感知和编译时的检查支持。
  当C#编译器遇到了一个查询语法表达式时,实际上它会被转化为使用扩展方法和Lambda表达式的方法调用。

  我们举一个例子来解释这个:

var result = from c in Customers where c.City.StartsWith("B") orderby c.LastName select new { c.FirstName, c.LastName, c.Address };

  上面的代码等价于:

var result = Customers.Where( c => c.City.StartsWith("B") ) .OrderBy( c => c.LastName ) .Select( c => new { c.FirstName, c.LastName, c.Address } );

  使用查询语法的好处还有它会使代码更简单更易读。
  同时注意,查询表达式以from开头,以select或者group结尾。

  最后注意

  C#3.0中新引入的几个特性大多数都仅仅是“编译器技巧”或者“语法糖”,其实编译器生成的IL中间代码和原来的是一样的,这样他们就独立于framework和CLR运行时。但是,他们确实需要某些framework的支持,比如System.Core.dll程序集。这就是为什么扩展方法仍然需要依靠于System.Core.dll里包含的System.Runtime.CompilerServices.ExtensionAttribute。
另一方面,查询表达式只是实现了到扩展方法的映射,它包含在System.Linq, System.Data.Linq和System.Xml.Linq命名空间中。

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

22/2<12

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

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