编程语言
首页 > 编程语言> > C#委托与事件

C#委托与事件

作者:互联网

委托

定义

  委托的定义和方法的定义类似,只是在定义的前面多了一个delegate关键字。方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序,方法的返回类型要和委托一致,方法的返回类型不属于方法签名的一部分。委托使得一个方法可以作为另一个方法的参数进行传递。
public delegate void MyDelegate(int paral, string para2);

如何使用

  使用委托的步骤为:定义委托类型-声明委托变量-实例化委托-作为参数传递给方法-调用委托。下面具体分析委托的使用过程。
(1) 定义委托类型:delegate void MyDelegate(type paral, type para2);。其定义方式类似于方法的定义,只是多了一个delegate关键字。
(2) 声明委托变量:MyDelegate d;。既然委托是一种类型,那么可以使用委托来声明一个委托变量,相当于int a。
(3) 实例化委托:d = new MyDelegate(obj.InstanceMethod);。第二步只是声明了委托变量, 但并没有将它实例化。类的实例化使用new关键字来实现,而委托也属于类类型,所以委托的实例化也使用new关键字来进行的。
(4) 作为參数传递给方法:MyMethod(d);。委托使得在C#中,可以把一个方法作为另一个方法 的参数,而委托可以看作是一个包装方法的对象。
(5) 在方法中调用委托。

多播委托

  通过使用"+"运算符,我们能将多个委托对象链接到一个委托对象实例上,使其成为多路广播委托实例。在调用委托链时,被绑定到委托链中的每个委托都会被执行。使用"-"可以将某个委托从委托对象移除。

事件

定义及基本使用

  定义方式:访问修饰符 event 委托类型 事件名;public event EventHandler birthday;
  这里的访问修饰符一般定义为public,因为事件的订阅者需要对事件进行订阅与取消操作, 定义为公共类型可使事件对其他类可见。这里的委托类型,一般有两种:自定义的委托类型;.NET类库中预定义的委托类型EventHandler。事件件订阅者需要订阅事件发布者发布的事件,以便在事件被触发时接收消息并做出处理,使用“+=”运算符来订阅事件,使用“-=”运算符来取消事件订阅。

    class Program
    {
        static void Main(string[] args)
        {
            //初始化发布者对象
            Publisher publisher = new Publisher();
            //实例化朋友对象
            Buddy friendl = new Buddy("小张");
            Buddy friend2 = new Buddy("小王");

            //使用“+=”来订阅亨件
            publisher.MyEvent += new Publisher.MyHandler(friendl.SendMessage);
            publisher.MyEvent += new Publisher.MyHandler(friend2.SendMessage);
            //发出通知
            publisher.OnMarriageComing("今晚吃鸡!");
        }
    }
    public class Publisher
    {
        //自定义委托类型
        public delegate void MyHandler(string msg);
        //使用自定义委托类型定义事件,事件名为MarryEvent
        public event MyHandler MyEvent;
        //发出事件
        public void OnMarriageComing(string msg)
        {
            MyEvent?.Invoke(msg);
        }
    }

    //接受事件的的实体类
    public class Buddy
    {
        //字段
        public string Name;
        //构造函数
        public Buddy(string name)
        {
            Name = name;
        }
        //事件处理函数,该函数需要符合MyHandler委托的定义
        public void SendMessage(string mssage)
        {
            //输出通知信息
            Console.WriteLine(mssage);
            //对事件做出处理
            Console.WriteLine(this.Name + "收到");
        }
    }

EventHandler

  EventHandler委托的定义:public delegate void EventHandler(Object sender, EventArgs e);从EventHandler委托的定义可以看出:
□ 该委托的返回类型为void,因此实例化委托类型的方法也需要满足这点;
□ 第一个参数sender负责保存对触发事件对象的引用,其类型为object;
□ 第二个参数e负责保存事件数据

class Program
    {
        static void Main(string[] args)
        {
            //初始化发布者对象
            Publisher publisher = new Publisher();
            //实例化朋友对象
            Buddy friendl = new Buddy("小张");
            Buddy friend2 = new Buddy("小王");

            //使用“+=”来订阅亨件
            publisher.MyEvent += new EventHandler(friendl.SendMessage);
            publisher.MyEvent += new EventHandler(friend2.SendMessage);
            //发出通知
            publisher.OnMarriageComing("今晚吃鸡!");
        }
    }
    public class Publisher
    {
        // 使用EventHandler
        public event EventHandler MyEvent;
        //发出事件
        public void OnMarriageComing(string msg)
        {
            MyEvent?.Invoke(this, new EventArgs());
        }
    }

    //接受事件的的实体类
    public class Buddy
    {
        //字段
        public string Name;
        //构造函数
        public Buddy(string name)
        {
            Name = name;
        }
        //事件处理函数,该函数需要符合MyHandler委托的定义
        public void SendMessage(object s,EventArgs args)
        {
            //对事件做出处理
            Console.WriteLine(this.Name + "收到");
        }
    }

  EventArgs类是.NET类库中定义的类,它不保存任何数据(属性、字段等),我们可以通过扩展EventArgs类,自定义事件类,使其带有数据。

class Program
    {
        static void Main(string[] args)
        {
            //初始化发布者对象
            Publisher publisher = new Publisher();
            //实例化朋友对象
            Buddy friendl = new Buddy("小张");
            Buddy friend2 = new Buddy("小王");

            //使用“+=”来订阅亨件
            publisher.MyEvent += new Publisher.MyHandler(friendl.SendMessage);
            publisher.MyEvent += new Publisher.MyHandler(friend2.SendMessage);
            //发出通知
            publisher.OnMarriageComing("今晚吃鸡!");
        }
    }

    public class MyEventArgs : EventArgs
    {
        public string message;
        public MyEventArgs(string msg)
        {
            this.message = msg;
        }
    } 

    public class Publisher
    {
        //自定义委托类型,委托包含两个参数
        public delegate void MyHandler(object sender, MyEventArgs e);
        //定义事件
        public event MyHandler MyEvent;
        //发出事件
        public void OnMarriageComing(string msg)
        {
            MyEvent?.Invoke(this, new MyEventArgs(msg));
        }
    }

    //接受事件的的实体类
    public class Buddy
    {
        //字段
        public string Name;
        //构造函数
        public Buddy(string name)
        {
            Name = name;
        }
        //事件处理函数,该函数需要符合MyHandler委托的定义
        public void SendMessage(object s, MyEventArgs args)
        {
            //对事件做出处理
            Console.WriteLine(this.Name + "收到");
        }
    }

参考链接:
https://www.cnblogs.com/youmingkuang/p/11297811.html

标签:Buddy,委托,C#,void,事件,new,public,string
来源: https://www.cnblogs.com/beiyougaolou/p/15259924.html