Delegate And Event(委托和事件)

委托:

  将方法以变量形式传递,并且以方法形式执行。

举例:

int a;   //声明了一个整数类型的变量a

public delegate void sayHelloDlg();    //声明了一个无参无返回值的委托sayHelloDlg

比较

我们声明了一个整数变量"a",它的类型是int, 这个是比较容易理解和接受的;

“sayHelloDlg”可以看作是当前委托作用域下所有方法的类型。
namespace DelegateAndEvent {
    // 通常声明一个委托的时候,我们将它的作用域设置成全局的
    // 这是一个有参无返回值的函数,要想应用该委托,下面声明的方法需要与该委托签名保持一致。            签名:【返回值类型,参数列表】
    public delegate void sayHelloDlg(string name);   

    class Program {
        //声明一个sayHelloDlg 类型的事件
        public static event sayHelloDlg sayHelloEvent;

        static void Main(string[] args) {
            // 实例化Demo类
            Demo demo = new Demo();
            // 申明一个委托类型的变量“dlg”,将Demo类中的sayHello()函数赋值给该变量,注意函数赋值时不需要添加“()”
            sayHelloDlg dlg = demo.sayHello;
            // 通过委托调用该方法
            dlg("小明");
            ![控制台输出结果](https://img-blog.csdnimg.cn/20210309163022727.jpg#pic_center)

            //委托链          
            dlg += demo.sayGoodBye;   //调用多个函数,一起生效
            dlg -= demo.sayGoodBye;   //取消掉demo.sayGoodBye的使用
            
            //匿名函数
            //当我们想要创建一个函数,并且该函数仅被调用一次,我们就可以采取以下的方式创建一个匿名函数:
            sayHelloDlg dlg1 = delegate (string name) {
                Console.WriteLine($"{name},我是匿名函数");
            };
            dlg1("小红");
			![控制台输出结果](https://img-blog.csdnimg.cn/20210309163116558.jpg#pic_center)

            //lamda函数
            //进一步简化了代码,比匿名函数更加的简洁,只需要写一个参数,再通过 "= >"直接书写方法体
            sayHelloDlg dlg2 = (name) =>
            {
                Console.WriteLine($"{name},我是lamda");
            };
            dlg2("小张");
			![控制台输出结果](https://img-blog.csdnimg.cn/20210309163149367.jpg#pic_center)

            //添加订阅事件
            sayHelloEvent += getSayHelloEvent;
            // sayHelloEvent -= getSayHelloEvent;     //取消订阅事件
            // 调用事件
            if (sayHelloEvent != null) sayHelloEvent("小刘");
            ![控制台输出结果](https://img-blog.csdnimg.cn/20210309163218469.jpg#pic_center)
        }

        //定义一个静态方法
        public static void getSayHelloEvent(string name) {
            Console.WriteLine($"{name},我是事件!");
        }
    }

    class Demo {
        // 有参无返回值的函数
        public void sayHello(string name) {
            Console.WriteLine($"{name},你好呀!");
        }

        // 有参无返回值的函数
        public void sayGoodBye(string name) {
            Console.WriteLine($"{name},再见啦!");
        }
    }
}

总体而言,一个委托的开发步骤如下:

定义一个委托----->定义一个委托类型的变量------->给委托赋值(绑定方法)------->调用委托

事件: 可以看作是一个特殊签名的委托

  步骤:
       1.首先必须声明该事件的委托类型   格式:修饰符  delegate void 委托名 (参数)
       
       2.声明事件本身,使用 event 关键字(需要基于上面的委托定义事件)   格式:修饰符 event 委托名 EventHandler 事件名
       
       这样我们就定义了一个委托和一个事件,该事件在生成的时候会调用委托。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值