C#3.0中Lambda表达式详解
作者:mdxy-dxy 发布时间:2023-08-08 04:01:37
在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改变了我们写数据应用程序的方式,先前,开发人员需要考虑并编写不用的代码来处理不同数据源中的数据(SQL Server ,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";
编译时会报Cannot implicitly convert type string to int错误。
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的新特性应该还不止这些,还需继续学习研究。


猜你喜欢
- 为了能正常输出XML格式的内容,必须要对不被XML允许的那些特殊字符进行转换。本文介绍的正是如何使用C#判断XML字符串是否含特殊字符并进行
- Android选择图片的两种方式:第一种:单张选取通过隐式启动activity,跳转到相册选择一张返回结果关键代码如下:发送请求:priva
- 最近项目里面用到了一个日期选择器,实现现在主流的WheelView滑动选择,整理了下,做了个Demo.废话不多说,直接上代码.主布局:act
- 实际开发中订单往往都包含着订单状态,用户每进行一次操作都要切换对应的状态,而每次切换判断当前的状态是必须的,就不可避免的引入一系列判断语句,
- 首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不怕了。既然说到了原理,我们还是
- 一、项目简述功能包括: 登录注册,办理借阅。借阅记录,预约借阅,借出未还, 借阅逾期,学生管理,图书管理,书库分类查询搜索。二、项目运行环境
- Intersect子句一、简介Intersect返回交集,交集是指同时出现在两个集合中的元素,和数据库中的Intersect方法实现功能一样
- 需求:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?抽象类中是否
- java arrayList遍历的四种方法及Java中ArrayList类的用法package com.test;import java.u
- Java程序设计 图形用户界面 【九】单选按钮单选按钮 JRadioButtonJRadioButton类方法作用public JRadio
- 以前的Java项目中充斥了太多不友好的代码:POJO的Getter/Setter/toString等等,这些代码由于没有什么技术含量,影响了
- 本文实例讲述了C#遍历子目录的方法。分享给大家供大家参考。具体实现方法如下:DirectoryInfo directoryInfo = ne
- 代码如下:/** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST &nbs
- 目录1、在异常处理中,如释放资源,关闭数据库、关闭文件应由( )语句来完成。2、如下Java语句 double x=2.0; int y=4
- 前言Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固。相关版本:java: jd
- 前言感觉Jpa的动态构建查询不好使用,然后mybatis-plus没有动态构建表的功能,有没有可能使两者混合使用,利用Jpa自动建表的优势
- 当我提交项目输入中文描述信息的时候,发现IDEA 的 Terminal无法显示中文信息,显示的是下面这样的因为我的终端设置了git.bash
- 用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断
- 本文实例为大家分享了Android实现串口通信的具体代码,供大家参考,具体内容如下生成so文件首先确保已经安装了NDK和CMake然后创建一
- 本文实例为大家分享了Android自定义View实现圆环进度条的具体代码,供大家参考,具体内容如下效果展示动画效果View实现1.底层圆环是