C# 委托,泛型委托,匿名委托,lambda表达式

1、为什么要使用委托

将一个方法作为参数传递给另一个方法

2、委托概念

声明:

public delegate int DelegateName(int a, int b);

声明一个委托类型,可以用访问修饰符修饰,delegate关键字,有返回值和参数

委托所指向的函数必须跟委托具有相同的签名,即相同的参数个数,相同的参数类型和相同的返回值类型

创建委托实例写法:
委托 委托名=new 委托(会调用的方法名)
或者:
委托 委托名 =会调用的方法名

3、泛型委托

声明:

public delegate T 委托名<T>(T a, T b);

我们每次要使用一个委托时,都需要先声明这个委托类,规定参数和返回值类型,然后才能实例化、调用。为了简化这个过程, .NET 框架为我们封装了三个泛型委托类,它们分别是Action,Func和Predicate。因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,方便了我们的日常Coding。

1). Action

public delegate void Action<T>(T obj1,Tobj2,...);

Action是无返回值的泛型委托

Action表示无参,无返回值的委托

Action<int,string> 表示有传入参数int,string无返回值的委托

Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

Action至少0个参数,至多16个参数,无返回值。

创建委托实例写法:
Action<参数1, 参数2> 委托名= ((参数1,参数2) => {无返回值的方法体 });

2). Func

public delegate<T> Func<T>(T obj1,Tobj2,...);

Func是有返回值的泛型委托

Func<int> 表示无参,返回值为int的委托

Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

Func<T1,T2,T3,int> 表示传入参数为T1,T2,T3(泛型)返回值为int的委托

Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

创建委托实例写法:
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });

3). Predicate

  public delegate bool Predicate<T>(T obj);

这个委托只能传入一个参数,并且如参的类型由使用者自行提供,返回一个bool类型的值。

Predicate 是返回bool型的泛型委托

Predicate<int> 表示传入参数为int 返回bool的委托

Predicate有且只有一个参数,返回值固定为bool

创建委托实例写法:
Predicate<参数1> 委托名= ((参数1) => {带返回值的方法体 });

4、匿名函数(没有函数名,直接方法体)

本来呢委托定义(声明)好之后,还得再单独定义委托需要使用的方法。不如说你定义了一个计算器的委托, 你还需要重新写计算加减乘除的方法了来供计算器委托来使用。这时候我们就想到了匿名方法。用匿名方法就不需要再单独写加减乘除这些方法了,只需要在匿名方法的方法体内实现这些逻辑就好了。

例子如下:


		delegate int calculator(int x, int y); //委托类型

        static void Main(string[] args)
        {
            //创建委托对象(确定与哪些方法进行绑定),委托实例名=new 委托名(某个类的方法)本例与加法向绑定
            calculator Adding =delegate( int x, int y)
            {
               return x+y;
            };


            calculator Moveing = delegate(int x, int y)
            {
                return x - y;
            };


            calculator Multiply = delegate(int x, int y)
            {
                return x * y;
            };


            calculator Divide = delegate(int x, int y)
            {
                return x / y;
            };
            Adding(4, 4);//8
            Moveing(4, 4);//0
            Multiply(4, 4);//16
            Divide(4, 4);//1

        }

创建委托实例写法:
委托 委托名=delegate(参数){会调用的方法体};

5、 Lambda表达式

定义:"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式

好处:Lambda简化了匿名委托的使用,减少开发中需要编写的代码量。

具体内容:它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。

写法:所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。Lambda表达式x => x * x读作"x goes to x times x"。

创建委托实例写法:
委托 委托名=(参数1,。。参数n)=>{会调用的方法体};

六、调用委托实例通用写法:

1.委托实例.Invoke(参数列表)

2.委托实例(参数列表)

3.this.Invoke(委托实例, new object[] { 参数列表});

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值