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