C#之委托

委托的定义

委托是声明了返回类型和参数组成一种数据类型

委托可以代理和委托签名(这里指返回类型和参数)一致的静态方法实例方法

委托能存储方法的地址

委托是一类行为的抽象

当调用委托时就是调用了这个方法


委托的种类

单播委托 只绑定一个方法

多播委托 绑定多个方法,只返回最后一个方法的结果

Handler handler = new Handler(Fun);
handler=handler+new Handler(Fun2);//多播委托

有返回值时不适合多播委托,多播适合没有返回值的方法

委托的多种写法

public delegate int Handler(int a,int b);
//定义委托

Handler handler = new Handler(Fun);
//创建委托,方法一

Handler handler = Fun;
//简化,方法二

Handler handler = delegate(int a)
{
    for (int i =0; i< a; i++)
        Console. WriteLine("HAHA");
};
//匿名方法,不需要重用的时候,方法三

Handler handler = (p)=> {Console. WriteLine(p+ "HAHA");}
//lambda表达式,一个参数,一行代码时可以省略小括号和大括号,
//因为定义委托时就有参数类型,所以可以不写,方法四

handler(a,b);
//调用委托

public static int Fun(int a,int b)
{
    return 0;
}

委托的作用

将方法做为参数传递,可以将一个方法的执行代码注入到另一个方法中

//调用端
A a=new A();
a.fun(()=>{});//可以直接传递lambda表达式或方法
//执行顺序1 3(括号里的方法) 5(结束)
public class A
{
    public void fun(Handler handler)
    {
        handler();//2
        其他语句//4
    }
}

vpublic delegate void Handler();//定义委托


为什么要注入:
有的语句/步骤能定下来,有的暂时定不下来.
可以使用委托表示确定不下来的.
调用时再确定把有些功能推迟到调用端确定


实现回调,实现的方式比接口更灵活

回调就是方法写在调用端,可以随时换要用的方法

不确定的语句,不使用委托就要定义大量的类


委托事件实现的基础.

事件

事件是声明为委托类型的类的成员,表示类的偶发的行为,一旦这个行为发生,往往要引起其它行为的自动执行

事件是用来实现两个或多个行为的联动调用的。

1定义事件:public event【省略】委托类型事件名;
2注册事件:事件源对象.事件+=响应方法【简化的写法】
传统写法如下.
事件源对象.事件+=new委托类型(响应方法)
+=这里是注册符号,不同于复合加i+=1.
取消注册-=
3触发事件:事件在类内部触发,触发代码等同于用委托调用方法.
事件定义在哪里就在哪里触发

事件模式的缺点:代码繁琐.
事件模式的优点:平台可以封装共性常用的代码,程序员完成个性化的即可

 

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

namespace delegateTest
{
    delegate void Handler();
    class Program
    {
        static void Main(string[] args) 
        {
            LaoYing laoYing = new LaoYing();
            XiaoJi xiaoJi = new XiaoJi();
            Dog dog = new Dog();
            laoYing.Chong += xiaoJi.TaoPao;
            //使用顺序,第二步,绑定事件
            laoYing.Chong += dog.Jiao;
            laoYing.Fun();
            //使用顺序,第四步,调用触发事件的方法
            Console.ReadKey();
        }

    }
    class LaoYing
    {
        public event Handler Chong;
        //使用顺序,第一步,定义事件
        public void Fun()
        {
            Console.WriteLine("老鹰冲");
            if(Chong!=null)
            {
                Chong();
                //使用顺序,第三步,触发事件
            }
        }
    }
    class XiaoJi
    {
        public void TaoPao()
        {
            Console.Write("小鸡逃跑");
        }
    }
    class Dog
    {
        public void Jiao()
        {
            Console.Write("狗叫");
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值