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

  • Post author:
  • Post category:其他



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


什么是委托?

先看最简单的委托例子

:


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



版权声明:本文为Wiiix原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。