C#面象对象学习:委托(delegate)

来源:互联网 发布:加拿大硕士奖学金知乎 编辑:程序博客网 时间:2024/05/16 19:54

这些天来,我一直在看委托;

MSDN上看了看关于委托的文章,越看越糊涂了;

没有办法,只好用GOOGLE多搜几种解释委托的方法来看看,以及翻了翻写得比较详细的一些书籍。

力求搞懂这个委托,和学会使用委托

委托,到底什么呢?

很多书上和网络文章上都说:
        C#中的委托,就相当于C/C++中的函数指针;但是C#是一种类型安全语言;在一般情况下不允许使用指针;
        而委托的出现刚刚好弥补了这一缺陷,委托是类型安全操作;

如何使用委托呢?

委托的使用分为三步(也有说委托实际相当于一种特殊的类):委托声明,委托实例化,委托调用

下面我写一个简单的委托实例;也许这个实例不用委托实现也能完成,但我的目的只是为了明白如何使用委托而以

 

using System;

namespace Bino
{
    
delegate int NumOpe(int a,int b); //委托声明
    class Demo
    
{
        
static void Main(string[] args)
        
{
            Demo d 
= new Demo();
            NumOpe p1 
= new NumOpe(d.Add); //委托实例化
            Console.WriteLine(p1(1,2)); //委托调用
            Console.ReadLine();
        }


        
private int Add(int num1,int num2)
        
{
            
return(num1+num2);
        }

    }

}


例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致

事件其实就是委托的一种;

        有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。

        在WinForm和WebForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。

还有今天在CSDN上也看到一个关于委托链的文章

class Demo
{
      
private string name;
      
public Demo(string str)
      
{
           
this.name = str;
      }


      
public void Test()
      
{
       ...
//代码体略
      }

}

Demo类有一个方法Test(),对他的实例来说A,B,C都有自己Test

 

Demo a,b,c;
= new Demo("AAA");
= new Demo("BBB");
= new Demo("CCC");

假如这里通过定义委托来调用Test;

public delegate void Test()

如果想调用a.Test();

就可以通过

Test aTest = new Test(a.Test);

//同样b,c也要这样;

Test bTest 
= new Test(b.Test);
Test cTest 
= new Test(c.Test);

这个时候,如果想要a,b,c的Test共同执行的话,就要再定义一个复合委托;

 

Test AllToTest ;

   //c#中通过“+“将方法Connect到委托,即将委托加到委托链中

   //通过“-”将方法从委托链中删除

   AllToTest = aTest+bTest+cTest;

看到+号应该不陌生,感觉在哪见过吧;

.net中的事件机制就是通过委托来实现的。

所以经常会看到这个+号;