C#3.0中Lambda表达式详解

 更新时间:2020年6月25日 11:40  点击:2171

在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的新特性应该还不止这些,还需继续学习研究。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25