[随手笔记]彻底搞懂C#的委托和事件

什么是委托

委托是特殊的类。

创建一个委托类

delegate void MyDel();//就是创建一个委托类,它等价于class MyDel{}当然,这里我只是打比方,方便理解。

delegate void MyDel();可以理解为 class MyDel{}

既然是类,那么它就可以在任何地方创建。 

实例化一个委托对象

MyDel myDel = new MyDel();//只有类才需要实例化,这个暴露出了委托的本质就是一个特殊的类。

委托内部结构

利用委托的方式是,通过委托实例添加要委托执行的方法,可以添加多个方法,统一执行,那么可以知道,委托类的内部维护了一个方法列表和执行函数。

//需要委托的方法
public void Function1(){}
public void Function2(){}
public void Function3(){}
.....
public void Functionn(){}
//添加到委托类内部列表
myDel +=Function1;
myDel +=Function1;
myDel +=Function1;
myDel +=Function1;
//执行
myDel();

委托就这么简单。

什么是事件

事件,就是一个类需要回调或监听发生了什么。

事件的本质是委托的一个实例

deletegate void MyDel();//创建一个委托类
event MyDel EventDel();//实例化一个委托,可以理解为实例化了一个EventDel对象,
实际上理解为 Myel EventDel = new Myel();因为是实例所以只能在类中声明

event说明

event标识,表示是一个事件,在该事件的什么的类中才能触发该事件,其他类不能触发, 只能添加方法。

案例:

类ClassA

 public class ClassA
    {
        private delegate void MyDel();

        public MyDel MyADel;
        public event MyDel MyEvent;

        public void Action()
        {
            MyEvent();
        }
    }

类ClassB

  public class ClassB
    {
        public void ActionA(ClassA classA){
            //classA.MyEvent();//这样是错误的,只能在ClassA中调用
            classA.MyEvent+=TheB;//这样子是正确的
        }

        public void DelA(ClassA classA)
        {
            classA.MyADel += TheB;
            classA.MyADel -= TheB;
            classA.MyADel();
        }
        public void TheB()
        {
            Console.WriteLine("我是在B类中触发的");
        }
    }

委;托和事件的区别

1.委托是类,事件是委托的实例

2.事件不能new

3委托可以通过构造函数添加方法,事件只能+=和-=管理方法。

4.委托可以在任何地方创建,事件只能在类中创建。

5.事件只能在声明它的类中调用,委托没有这个限制。

 

委托和事件的应用场景

委托:

1.用于一组具有相同签名的方法的执行。

2.用做方法参数,可以传递。

3.在异步中监听并回调是否执行完成。

事件:

1.用于某个类的某个请求或方法的监听

Action和Func

Action和Func就是为了避免每次都创建委托而产生的共用委托类。

Action

action就是可带参数的委托类,但是没有返回值

例如:下面相等

delegate void MyDel() = Action

delegate void MyDel(string str) = Action<String>

delegate void MyDel(string str1,string str2,...) = Action<string,string,....>

使用案例

Action ac = new Action(MyDel);

ac();//执行

public void MyDel(){

 

}

Func

func是必须有返回值,并可带参数

例如:下面的相等

delegate string MyDel() = Func<string>

delegate string MyDel(string str) = Func<string,string(该参数为返回值类型)>

delegate string MyDel(string str1,string str2,....,string n) = Func<string ,string,....string(该参数为返回值类型)>

func可以作为参数传递值

使用案例:

Func<string> func = delegate{ return "AA";};

public string GetAA(Func<string> func){//做为参数传递

var aa = func();

Console.WriteLine(aa);

}

有人私信我,我有空再次总结,有什么不对的地方请私聊。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值