C#3.0中Lambda表达式详解
在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的一些东西)。但是在C#3.0中,微软给我带来的一些新特性可能是以前所有开发语言都没有的特性。这无疑大大的体现了C#3.0在开发语言中强大的优势。
Lambda表达式
Lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有Lambda表达式都使用Lambda运算符=>。关于Lambda更详细的讲解大家可以参看MSDN。里面说的很清楚。
这里简单举个例子来说明Lambda的好处。Lambda在对匿名委托的处理上提供了更清楚的实施方式。例如在2.0中。我们可以写这样的代码:
publicclassExample { publicstaticvoidDemo(System.Windows.Controls.TextBlockoutputBlock) { Funcconvert=delegate(strings) {returns.ToUpper();}; stringname="Dakota"; outputBlock.Text+=convert(name)+"n"; } }
在C#中将Func<(Of<(T,TResult>)>)委托与匿名方法一起使用。
在3.0中,我们可以使用Lambda来更清楚的进行参数的传递:
publicclassExample { publicstaticvoidDemo(System.Windows.Controls.TextBlockoutputBlock) { Funcconvert=s=>s.ToUpper(); stringname="Dakota"; outputBlock.Text+=convert(name)+"n"; } }
Lambda表达式的基础类型是泛型Func委托之一。这样能以参数形式传递lambda表达式,而不用显式将其分配给委托。尤其是,因为System.Linq命名空间中许多类型方法具有Func<(Of<(T,TResult>)>)参数,因此可以给这些方法传递lambda表达式,而不用显式实例化Func<(Of<(T,TResult>)>)委托。这样可以使我们的代码更加简洁,逻辑上更易于理解。
对象的初始化
在C#中,对象的初始化也做了一些改进。一个新的功能就是提供了更方便的语法规则来声明变量的值。
假如我们声明一个Student对象:
publicclassStudent { privatestring_stuName; privatestring_stuAge; privateint_stuClass; publicStudent(){} publicstringStuName { get{return_stuName;} set{_stuName=value;} } publicstringStuAge { get{return_stuAge;} set{_stuAge=value;} } publicintStuClass { get{return_stuClass;} set{_stuClass=value;} } }
在C#2.0中,我们是这样声明变量并赋值的:
Studentstu=newStudent(); stu.StuName="Brian"; stu.StuAge="21"; stu.StuClass="1班";
而在C#3.0中,我们可以这样初始化对象:
Studentstu2=newStudent { StuName="Brian", StuAge="21", StuClass="1班" };
从代码中不难看出,C#3.0给我们提供了很方便得方式来进行对象的初始化工作。
查询
这个想必大家都应该有所耳闻,那就是鼎鼎大名的Linq。这是C#3.0中最独特好用的新特性之一。Linq改变了我们写数据应用程序的方式,先前,开发人员需要考虑并编写不用的代码来处理不同数据源中的数据(SQLServer,XML,Memory....)。LINQ很好的帮我们解决了这个烦人的问题。同时借助Lambda,我们可以更方便准确的查询我们想要的数据。
使用Linq简单的数据查询例子:
privatevoidBindGridView(stringcriteria) { stringstrConn=ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; NorthwindDbdb=newNorthwindDb(strConn); IEnumerableresults; if(criteria==string.Empty) { results=db.Employee.ToArray(); } else { results=(fromcindb.Employee wherec.FirstName.Contains(criteria) selectc).ToArray(); } GridView1.DataSource=results; GridView1.DataBind(); }
变量声明
这里要说的是var。var是C#3.0中提供的用于声明变量的关键字,开发人员可以不考虑变量的类型就可以对变量进行声明(这一点用法非常类似Javascript)。但是两者还是有些差异。
相同点:用var来声明任何类型的局部变量。
不同点:它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。
我们可以这样声明变量:
vari=10; varname="edisundong"; varnumbers=newint[]{1,2,3};
var仅仅是个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于
inti=10; stringname="edisundong"; int[]numbers=newint[]{1,2,3};
这里还需要注意几点:
1.在声明时必须同时赋值。
2.在使用var声明一个局部变量后,他仍然具备强类型。
varinteger=10;
integer="edisundong";
编译时会报Cannotimplicitlyconverttypestringtoint错误。
3.初始化器表达式的编译期类型不能够是空(null)类型。
4.var的声明仅限于局部变量
扩展方法
以前如果我们想扩展一个类的功能必须直接源自于它并且从学其中的方法,在C#3.0中,介绍了一种很快捷的扩展功能的方法。
publicstaticclassStudentExtensionMethods { publicStudentExtensionMethods() { // //TODO:在此处添加构造函数逻辑 // } publicstaticstringGetStudentInformation(thisStudentstu) { returnstring.Format("Name:{0}{1}Age:{2}",stu.StuName, stu.StuAge,stu.StuClass); } }
定义一个类,其中定义一个方法,注意:这个类和方法都是static的,并且方法的参数是类Student。这样,Student类就可以扩展GetStudentInformation方法:
Studentstu2=newStudent { StuName="Brian", StuAge="12", StuClass="1班" }; Console.WriteLine(stu2.GetPersonInformation());
小结:初学了下C#3.0,感觉带来了不少惊喜,其中有很多新的特性是以前所未知的。C#3.0的新特性应该还不止这些,还需继续学习研究。
相关文章
- C#中new和override区别
- C#并行计算 Parallel.ForEach[通俗易懂]
- C# SOCKET发送和接收例子详解编程语言
- C#通过正则表达式抓取网页信息的类详解编程语言
- 使用SHA256WithRSA来签名和验签(.NET/C#)详解编程语言
- C程序操作MySQL数据库的锁表实现方法(c# mysql 锁表)
- C中MySQL数据库的插入操作(c#mysql 插入)
- [c#]asp.ent下开发中Tag的开发技巧
- C#使用正则表达式实例
- C#常用知识点简单回顾(有图有真相)
- 在C#中对TCP客户端的状态封装详解
- 解析C#中@符号的几种使用方法详解
- 基于c#图像灰度化、灰度反转、二值化的实现方法详解
- 探讨如何配置SQL2008,让其允许C#远程外部连接的方法详解
- C#中按引用传递与按值传递的区别,以及ref与out关键字的用法详解
- C#委托所蕴含的函数指针概念详细解析
- C#调用Java代码的方法介绍
- C#基本概念列举详解
- C#引用访问权限分析
- C#获取文件夹及文件的大小与占用空间的方法
- C#中自定义事件和委托实例
- C#中子类调用父类的实现方法