当前位置:首页 > Windows程序 > 正文

快速理解C#中的委托与事件

2021-03-19 Windows程序

以下内容只是个人理解,仅供参考。

什么是委托?

先看最简单的委托例子:

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; }

多路广播委托:

如果说委托对象是一个容器,那一个委托对象可以绑定多个方法。

很简单,我们使用+=来绑定更多的对象。

反之,我们可以用-=来取消绑定对象。


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(string str) { Console.WriteLine(str); } static void Main(string[] args) { MessageDelegate msgDelegate = new MessageDelegate(SaySomething); msgDelegate += SayAnything; msgDelegate("Meh"); Console.ReadKey(); } } }

输出结果为:

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