C#中的委托概念

来源:互联网 发布:多媒体网络信息处理 编辑:程序博客网 时间:2024/05/21 09:09

委托(delegate)也可以看成是一种数据类型,可以用于定义变量。但它是一种特殊的数据类型,它所定义的变量能接收的数值只能是一个函数,更确切地说,委托类型的变量可以接收一个函数的地址,很类似于C++语言的函数指针。简单地说:委托变量可看成是一种类型安全的函数指针,它只能接收符合其要求的函数地址。看下面示例:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            MathOptDelegate oppDel;            MathOpt obj = new MathOpt();            //委托变量接收一个对象的方法引用,赋值之后像普通函数一样使用            oppDel = obj.Add;            Console.WriteLine(oppDel(1,2));        }    }    public class MathOpt    {        public int Add(int arg1,int arg2)         {            return arg1 + arg2;        }    }    //定义委托类型MathOptDelegate,使用关键字delegate    public delegate int MathOptDelegate(int value1,int value2);}

委托是一个派生自Delegate 的类,委托接收函数时,要求函数参数类型和返回值跟委托定义的一样。只要满足这个要求,不管是静态的还是实例的都可以委托给它。

事实上,委托不仅可以代表某一函数,还可以组合“一堆”函数,然后批量执行他们。看下面示例:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication2{    class Program    {        static void Main(string[] args)        {            MyDelegate a, b, c, d;            //创建引用Hello方法的委托对象a            a =MyClass.Hello;            Console.WriteLine("调用委托变量a:");            a("a");            //创建引用 Goodbye 方法的委托对象 b:            b = MyClass.Goodbye;            Console.WriteLine("调用委托变量b:");            b("b");            // a 和 b 两个委托合成 c,            c = a + b;            Console.WriteLine("调用委托变量c:");            c("c=a+b");// c 将按顺序调用两个方法            // 从组合委托c中移除 a ,只留下b,用d代表移除结果,            d = c - a;            Console.WriteLine("调用委托变量d:");            d("d=c-a");//仅调用 Goodbye 方法:        }    }    delegate void MyDelegate(String s);    class MyClass    {        public static void Hello(String s)        {            Console.WriteLine("您好,{0}",s);        }        public static void Goodbye(String s)        {            Console.WriteLine("再见,{0}", s);        }    }}



 

0 0
原创粉丝点击