C#3.0中Lambda表达式如何使用 - 编程语言
这篇文章给大家介绍C#3.0中Lambda表达式如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
Lambda表达式
Lambda 表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>。关于Lambda更详细的讲解大家可以参看 MSDN。里面说的很清楚。
这里简单举个例子来说明Lambda的好处。Lambda在对匿名委托的处理上提供了更清楚的实施方式。例如在2.0中。我们可以写这样的代码:
Code public class Example { public static void Demo(System.Windows.Controls.TextBlock outputBlock) { Func convert = delegate(string s) { return s.ToUpper(); }; string name = "Dakota"; outputBlock.Text += convert(name) + "\n"; } }
在 C# 中将 Func<(Of <(T, TResult>)>) 委托与匿名方法一起使用。
在3.0中,我们可以使用Lambda来更清楚的进行参数的传递:
Code public class Example { public static void Demo(System.Windows.Controls.TextBlock outputBlock) { Func convert = s => s.ToUpper(); string name = "Dakota"; outputBlock.Text += convert(name) + "\n"; } }
Lambda 表达式的基础类型是泛型 Func 委托之一。这样能以参数形式传递 lambda 表达式,而不用显式将其分配给委托。尤其是,因为 System.Linq 命名空间中许多类型方法具有 Func<(Of <(T, TResult>)>) 参数,因此可以给这些方法传递 lambda 表达式,而不用显式实例化 Func<(Of <(T, TResult>)>) 委托。这样可以使我们的代码更加简洁,逻辑上更易于理解。
对象的初始化
在C#中,对象的初始化也做了一些改进。一个新的功能就是提供了更方便的语法规则来声明变量的值。
假如我们声明一个Student对象:
Code public class Student { private string _stuName; private string _stuAge; private int _stuClass; public Student() { } public string StuName { get { return _stuName; } set { _stuName = value; } } public string StuAge { get { return _stuAge; } set { _stuAge = value; } } public int StuClass { get { return _stuClass; } set { _stuClass = value; } } }
在C#2.0中,我们是这样声明变量并赋值的:
Student stu = new Student(); stu.StuName = "Brian"; stu.StuAge = "21"; stu.StuClass = "1班";
而在C#3.0中,我们可以这样初始化对象:
Student stu2 = new Student { StuName = "Brian", StuAge = "21", StuClass = "1班" };
从代码中不难看出,C#3.0给我们提供了很方便得方式来进行对象的初始化工作。
查询
这个想必大家都应该有所耳闻,那就是鼎鼎大名的Linq。这是C#3.0中最独特好用的新特性之一。Linq改变了我们写数据应用程序的方式,先前,开发人员需要考虑并编写不用的代码来处理不同数据源中的数据(SQL Server ,XML ,Memory….)。LINQ很好的帮我们解决了这个烦人的问题。同时借助Lambda,我们可以更方便准确的查询我们想要的数据。
使用Linq简单的数据查询例子:
Code private void BindGridView(string criteria) { string strConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; NorthwindDb db = new NorthwindDb(strConn); IEnumerable results; if (criteria == string.Empty) { results=db.Employee.ToArray(); } else { results = (from c in db.Employee where c.FirstName.Contains(criteria) select c).ToArray(); } GridView1.DataSource = results; GridView1.DataBind(); }
变量声明
这里要说的是var。var是C#3.0中提供的用于声明变量的关键字,开发人员可以不考虑变量的类型就可以对变量进行声明(这一点用法非常类似Javascript)。但是两者还是有些差异。
相同点:用var来声明任何类型的局部变量。
不同点:它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。
我们可以这样声明变量:
var i= 10; var name = "edisundong"; var numbers = new int[] { 1, 2, 3 };
var仅仅是个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于
int i= 10; string name = " edisundong "; int[] numbers = new int[] { 1, 2, 3 };
这里还需要注意几点:
1.在声明时必须同时赋值。
2.在使用var声明一个局部变量后,他仍然具备强类型。
var integer = 10; integer = " edisundong ";
编译时会报Cannot implicitly convert type string to int错误。
3. 初始化器表达式的编译期类型不能够是空(null)类型。
4. var的声明仅限于局部变量
扩展方法
以前如果我们想扩展一个类的功能必须直接源自于它并且从学其中的方法,在C#3.0中,介绍了一种很快捷的扩展功能的方法。
Code public static class StudentExtensionMethods { public StudentExtensionMethods() { // //TODO: 在此处添加构造函数逻辑 // } public static string GetStudentInformation(this Student stu) { return string.Format("Name: {0} {1} Age: {2}", stu.StuName, stu.StuAge, stu.StuClass); } }
定义一个类,其中定义一个方法,注意:这个类和方法都是static的,并且方法的参数是类Student。这样,Student类就可以扩展GetStudentInformation方法:
Code Student stu2 = new Student { StuName = "Brian", StuAge = "12", StuClass = "1班" }; Console.WriteLine(stu2.GetPersonInformation());
关于C#3.0中Lambda表达式如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
发布于:2023-01-18,除非注明,否则均为
原创文章,转载请注明出处。
发表评论