C# 关于事件 委托的理解

    xiaoxiao2021-03-25  113

    C#看起来有点绕的感觉,不像c++那样严谨,类的定义,C#的方法,不是一个类型,只是其他类型的成员变量。还有C#必须是一个强类型的语言,参数类型都要加上前缀,比如:

    public void print(int){…},所以一个方法不能直接作为其他方法的参数。把一个方法名作为参数,无法制定类型,干脆传对象,然后执行方法。

    using System; namespace MyEventTest { public class SomeClass { public void Start(int a) { Console.WriteLine("Go: {0}",a); } } public class Publisher { public void StartEvent(int a, SomeClass sc) { if (sc != null) { sc.Start(a); //start function } } } public class MainClass { static void Main() { SomeClass some = new SomeClass(); Publisher p = new Publisher(); p.StartEvent(5,some); //Go:5 } } }

    —————以上方法可以实现,但不是最好的做法。 委托: public void start(int a){Console.WriteLine(“Go:{0}”,a);} 定义一个委托类型: public delegate void Mydel(int a); 定义Model是一个类型,委托在后台实现该派生自System.Delegate类。 定义委托,告诉编译器委托讲表示哪种方法(返回值+方法签名),该方法可以为任意类型的实例方法,静态方法,确保返回值类型和委托匹配,那就可以实例,可以引用这些方法。 必须创建该委托的实例,为它指定要引用的方法,如: Model d = some.start; + ,+= -,-= 表示添加更多的方法引用,删除引用; 2; 事件:EventHandle public delegate void EventHandle(object sender,EventArgs e)//EventArgs 主要用来存储事件数据 public delegate void EventHandle(object sender,EventArgs e);

    first step:

    public class MyEventArgs:EventArgs { public int Current{get;set;} } public class Publisher { public event EventHandle<MyEventArgs>MyEvent;//实例化事件 public int Sum(get;set;) public void StartEvnet(int a) { var EventCopy = MyEvent;//每次取一个副本 MyEventArg args = new MyEventArgs(); args.Current = a; this.Sum += a; if (EventCopy ! = null) { EventCopy(this,args)//调用事件 } } }

    second step:

    public class Subscriber{ public void Dosomething(object obj,MyEvnetArgs) { Publisher p = (Publisher)obj; Console.WriteLine("Meg:Sum = {0},Current = {1}",p.sum,e.Current); } public void Dosomething2(object obj,MyEventArgs e){ } }

    third step:

    public class MainClass { static void Main() { Publisher p = new Publisher{Sum = 0 Subscriber sub = new Subscriber(); p.MyEvent ++ sub.Dosomething1;//注册回调方法 p.MyEvent += sub.Dosomethin2; p.StartEvnet(5); //调用方法,间接触发事件 p.MyEvent -= sub.Dosomething;//取消注册 } } }

    难点分析: 1,在发布者类中实例化委托事件,并定义一个实例方法,用来调用委托事件 ,先定义一个用来存储事件数据的类 2,定义订阅者类,在该类中定义和委托事件相匹配的方法(事件触发时,实际要执行的方法) 3,在客户端代码中,在发布者类的实例上为委托事件注册回调方法

    *** 事件对象就是一个委托对象,把事件看作委托,就好理解了,Event 这个单词很忽悠人。

    转载请注明原文地址: https://ju.6miu.com/read-10982.html

    最新回复(0)