委托
委托的声明
委托实际上是一个函数(或叫方法)的引用。
声明委托与声明一个函数类似,需要在类型前面添加关键字delagate
,例如
public delegate void SaySomething(string msg);
这便声明了一个委托,要注意的是,其类型和参数与被引用函数的返回类型和参数要一致。比如下面这2个被引用函数:
public void SayHello(string name)
{
Console.WriteLine("Hello " + name);
}
public void SayBye(string name)
{
Console.WriteLine("Good Bye " + name);
}
委托的实例化与使用
实例化一个委托很简单,与实例化一个类相似,下面便实例化了2个委托:
SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);
实例化后就能像函数一样进行使用了:
sayHello("Bob");
sayBye("Alice");
注意:从以上可以看出,委托是一种特殊的类型。
事件
创建事件
事件不是类型,使用事件时直接创建一个事件即可,事件的创建需要用到委托(和关键字event),也就是事件的类型是我们或者别人事先声明的委托,如:
public delegate void SaySomething(string msg); // 声明一个委托
public event SaySomething E_SaySomething; // 创建一个SaySomething事件
把委托添加到事件中,这样“事件”发生时就会通过委托调用相应的函数:
SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);
E_SaySomething += sayHello; // 把委托添加到事件
E_SaySomething += sayBye; // 把另一个委托添加到事件
通常一个事件发生时我们只完成一个委托(即执行一个函数)即可,上面我们希望该事件发生时完成2个委托(分别是sayHello和sayBye)。
上面代码也可以简写(不创建委托实例,直接把函数添加到事件即可):
E_SaySomething += SayHello; // 注意SayHello是函数名 E_SaySomething += SayBye;
触发事件
可理解为事件发生时,完成与该事件关联的委托或函数。
E_SaySomething("Bob");
输出如下:
完整代码
namespace zzz_delegate_event
{
class EventTest
{
public delegate void SaySomething(string msg);
public event SaySomething E_SaySomething;
public void SayHello(string name)
{
Console.WriteLine("Hello " + name);
}
public void SayBye(string name)
{
Console.WriteLine("Good Bye " + name);
}
public void testDelegateEvent()
{
//SaySomething sayHello = new SaySomething(SayHello);
//SaySomething sayBye = new SaySomething(SayBye);
//E_SaySomething += sayHello;
//E_SaySomething += sayBye;
// 或简写为2行
E_SaySomething += SayHello;
E_SaySomething += SayBye;
E_SaySomething("Bob");
//E_SaySomething("Alice");
}
}
internal class Program
{
static void Main(string[] args)
{
EventTest eTest = new EventTest();
eTest.testDelegateEvent();
}
}
}
其它
在使用winform或WPF写桌面程序时,经常使用到事件,这是怎么实现的呢?
实际上,这些事件.Net框架已经帮我们创建好了(委托也声明好了),我们只需要编写一个函数(函数的返回类型、参数要与委托一致),然后把这些函数关联到相应的事件即可,这样事件触发时,就会执行我们定义的函数。
标签:函数,委托,C#,void,SaySomething,事件,public From: https://www.cnblogs.com/ajream/p/18070439