快速理解C#中的委托与事件
以下内容只是个人理解,仅供参考。
什么是委托?
先看最简单的委托例子:
namespace DelegateTest { public delegate void MessageDelegate(string name); class Program { private static void SaySomething(string name) { Console.WriteLine("You said " + name); } static void Main(string[] args) { MessageDelegate msgDelegate = new MessageDelegate(SaySomething); msgDelegate("Hello"); Console.ReadKey(); } } }
输出结果为:You said Hello
从代码中我们可以看到,SaySomething是一个方法,delegate是一个类。
通俗的来说,委托是方法的容器,就像数组string[]是string变量的容器。
如返回值void类型和接收string类型参数的委托对象只能绑定同样类型的方法。
MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
这句代码是初始化委托对象,我们把SaySomething这个方法封装进去msgDelegate中。
它的构造方法必须要有1个方法作为参数才能初始化。
初始化一个委托对象也可以直接赋值一个方法初始化,如:
MessageDelegate msgDelegate=SaySomething;
这个时候SaySomething方法已经装入了委托对象msgDelegate内,所以们可以通过调用委托对象来调用已装入的方法。
我们要使用的时候就把委托对象msgDelegate当做方法一样调用。
过程总结:
1.定义委托对象
public delegate void MessageDelegate(string name);
2.定义方法
private static void SaySomething(string name)
{
Console.WriteLine("You said " + name);
}
3.新建一个委托对象然后初始化
MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
或者
MessageDelegate msgDelegate=SaySomething;
4.调用委托对象
msgDelegate(“Hello”);
以上是不带返回值的委托,如果要带返回值的委托可以自己制定:
public delegate int AddNumber(int a,int b);
static void Main(string[] args)
{
AddNumber an= new AddNumber(MyFunc);
Int n=an(1,2);
Console.WriteLine(n);
Console.ReadKey();
}
private static int AddFunc(int a,int b)
{
return a+b;
}
多路广播委托:
如果说委托对象是一个容器,那一个委托对象可以绑定多个方法。
很简单,我们使用+=来绑定更多的对象。
反之,我们可以用-=来取消绑定对象。
输出结果为:
You said Meh
Meh
注意:委托对象的列表为空(null)的时候不能调用,但可以绑定或取消绑定对象。
既然委托对象是一个类,那么我们也可以把这个委托对象作为一个方法的参数来传递。
namespace DelegateTest { class Program { public delegate void MessageDelegate(string name); private static void SaySomething(string name) { Console.WriteLine("You said " + name); } private static void SayAnything(MessageDelegate msgDelegate) { if(msgDelegate!=null) msgDelegate("Hello"); } static void Main(string[] args) { MessageDelegate msgDelegate = new MessageDelegate(SaySomething); SayAnything(msgDelegate); SayAnything(SaySomething); msgDelegate.Invoke("xxx"); msgDelegate("xxx"); Console.ReadKey(); } } }输出结果为:
You said Hello
You said Hello
xxx
xxx
我们用了4种不同的方法依次调用,第一个是传入一个委托对象,第二个是传入方法,第三个是直接调用委托,第四个和第三个是等价的。
由此可看出我们可以把方法作为参数传入一个委托对象类型来调用,也可以把一个装有方法的委托类型作为参数传递后调用。
总结:
委托对象是一个类,可以传递与委托对象返回值和形参相同的方法,然后去调用它。
委托可以绑定多个方法然后依次调用。
委托是函数指针,主要功能是用来实现类之间的交流和回调,就像你委托朋友帮你做一件事,你朋友会告诉你进度。
为什么要用委托?什么时候用委托?
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/63533.html
- 上一篇:api HTTP请求执行流程
- 下一篇:C#分层开发MySchool