委派与匿名方法演化至Lambda运算式

摘要:委派与匿名方法演化至Lambda运算式

一、委派

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            //建立委派实例对象
            helloDelegate myHelloDelegate = new helloDelegate(pg.ReturnMessage);//透过delegate类,保存特定方法的参照,这些参照对应至实例类所定义的方法成员

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        public string ReturnMessage(string pName)
        {
            return pName;
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

也可写成下列方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数

        static void Main(string[] args)
        {
            //建立委派实例对象
            helloDelegate myHelloDelegate = ReturnMessage;//透过delegate类,保存特定方法的参照,这些参照对应至实例类所定义的方法成员

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadKey();
        }

        public string ReturnMessage(string pName)
        {
            return pName;
        }
    }
}

注意红色字会出错,原因为

“Error 1 An object reference is required for the non-static field, method, or property ‘ConsoleApplication1.Program.ReturnMessage(string)‘ ”

所以ReturnMessage前必须要再加上static以声明为静态方法

public static string ReturnMessage(string pName)
{
    return pName;
}

二、匿名委派

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立委派实例对象
            helloDelegate myHelloDelegate = delegate(string pName)//匿名委派
            {
                return pName;
            };

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

参、Lambda运算式

1.Lambda运算式是由称之为“goes to”Lambda操作符“=>”所组成,

用以取代匿名方法所引用的delegate,

语法格式为(input parameters) => (expression)

变化如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立委派实例对象
            helloDelegate myHelloDelegate = (string pName) =>//Lambda运算式
            {
                return pName;
            };

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

2.Lambda运算式更可以缩成一行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
//建立委派实例对象
            helloDelegate myHelloDelegate = (string pName) => { return pName; };//匿名委派

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

3.也可不需要大括号与return

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
//建立委派实例对象
            helloDelegate myHelloDelegate = (string pName) => pName; //匿名委派

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

4.可不指定输入类型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//委派是事件的基础
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
//建立委派实例对象
            helloDelegate myHelloDelegate = pName => pName; //Lambda运算式

            //应用程序经由委派类的方法参照、引用方法,完成调用进程
            string message = myHelloDelegate("a");
            Console.WriteLine(message);
            Console.ReadLine();
        }

        //委派是一种链机制
        public delegate string helloDelegate(string pName);//声明指定参照方法的输入参数
    }
}

四、另一演化范例

例:取得每个人的名称

List所提供的ConvertAll方法

var names =people.ConvertAll(p=>p.name);

Enumerable的select扩充方法

var names=Enumerable.select(people,p=>p.name);

使用比较直觉的写法

var names = people.Select(p=>p.name);

使用查询运算式

var names = from p in people select p.name;

参考数据:

Func 委派的用法

C# 笔记:Expression Trees

原文:大专栏  委派与匿名方法演化至Lambda运算式

原文地址:https://www.cnblogs.com/chinatrump/p/11491069.html

时间: 2024-10-14 05:12:46

委派与匿名方法演化至Lambda运算式的相关文章

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

委托,匿名方法,Lambda,泛型委托,表达式树

一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step02:声明一个方法来对应委托.public int Add(int x, int y){ return x + y;}protected void FrmTest_Load(object sender, EventArgs e){ //step03:用这个方法来实例化这个委托. CalculatorA

方法组转换和匿名方法

前面的文章介绍过,C# 1.0中出现委托这个核心概念,在C# 2.0中,委托得到了很大的改进.C# 2.0中委托的改进为C# 3.0中的新特性提供了铺垫,当我们了解了匿名方法后,Lambda的学习就会变得相对容易. 下面就看看C# 2.0中委托的改进. 方法组转换 在C# 1.0中,如果要创建一个委托实例,就必须同时指定委托类型和符合委托签名的方法.但是,在C# 2.0中,支持了方法组转换,也就是说我们可以从方法组到一个兼容委托类型的隐式转换.所谓"方法组"(method group)

C#4.0语法糖之第五篇: 匿名类 & 匿名方法

今天时间有点早,所以上来在写一篇文章吧,继续上一篇的文章,在我们平时编程过程中有没有遇到过这样的一个情景,你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法.事件和其他自定义的功能.同时,这个类仅仅在当前的应用程序中使用,而不需要在项目间重用.你所需要的只是一个“临时的”类型,现在我们来看看这个传统类的定义: 1 internal class oneClass 2  3 { 4  5      //定义若干私有数据成员 6  7      //通过属性来封装每个数据成员 8  9   

C#Lambda表达式的理解:谓词方法 匿名方法 使用Lambda

Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式.所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to".Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块. 下面三个方法会帮你会容易理解到Lambda表达式的好处,

C# 匿名委托、匿名方法、匿名对象、Lambda表达式

一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello" };var v = new[] {     new { Name = "Micro", Message = "Hello" },     new { Name = "Soft", Message = "Wold!" }};匿

从委托、匿名方法到Lambda

前面讲过委托的知识,本次由委托过渡到Lambda表达式,更易于理解. 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int[] intA = { 1, 3, 5, 7 }; 6 ProcArray(intA, AddOne); 7 foreach (int i in intA) 8 { 9 Console.Write(i + " "); 10 } 11 12 Console.ReadKey(); 13 } 14

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

Fun<>,匿名方法,Lambda表达式 冒泡排序C#

大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更高效的排序方法.这里的实现的冒泡排序,需实现功能:不仅数字排序,还要对任意对象排序 示例: 对People对象的Age(年龄)排序 对Student对象的Score(分数)排序 People: public class People { public string Name { get; set; } pub