详解C#委托与回调函数

来源:互联网 发布:淘宝店如何寻找货源 编辑:程序博客网 时间:2024/06/18 17:39

一、委托
委托是什么呢?这个名字的意思已经赋予了我们想象的空间,你是编程的,你现在正在写一个ASP.NET网页,而JS是你不用起来不是特别的顺手,于是你委托你的一个朋友或者同事来帮助你完成JS部分。这就是委托,把你所不能做的事情交给其他人去做。而怎么知道是哪个人去做呢?当然是要知道名字!而为了区别名字一样的不同人,因此,需要描述一个特征。

在C#中,委托的作用是这样描述的:委托就像一个函数的指针,在程序运行时可以使用它们来调用不同的函数。这个其实和你委托同事完成 JS代码一样。如果有两位同事可以做这件事情,他们只要做的结果能够满足你的需求(就像一个接口),尽管他们做的过程不一样,并且作出的效果也不一样,但是,能够达到你的要求就可以了。

1、简单的委托
那委托需要承载哪些信息呢?首先,它存储了方法名,还有参数列表(方法签名),以及返回的类型。比如:
delegate string/返回类型/ ProcessDelegate(int i);
这就是一个委托的定义。蓝色部分是声明委托的关键字,红色部分是返回的类型,而黑色部分是委托的类型名,和一个类名差不多,而()里的就是参数部分。它的意思是,你要使用这个委托来做事情的话,那么,做事情的方法必须满足以下条件:
1、返回类型和委托的返回类型一致,这里是string类型;
2、能且只能有一个参数,并且是int类型。
* 接下来我们直接上代码来看一下:*

 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4  5 namespace TestApp 6 { 7     /// <summary> 8     /// 委托 9     /// </summary>10     /// <param name="s1"></param>11     /// <param name="s2"></param>12     /// <returns></returns>13     public delegate string ProcessDelegate(string s1, string s2);14 15     class Program16     {17         static void Main(string[] args)18         {19             /*  调用方法  */20             ProcessDelegate pd = new ProcessDelegate(new Test().Process);21             Console.WriteLine(pd("Text1", "Text2"));22         }23     }24 25     public class Test26     {27         /// <summary>28         /// 方法29         /// </summary>30         /// <param name="s1"></param>31         /// <param name="s2"></param>32         /// <returns></returns>33         public string Process(string s1,string s2)34         {35             return s1 + s2;36         }37     }38 }

输出的结果是:
Text1Tex2

2、泛型委托

using System;using System.Collections.Generic;using System.Text;namespace TestApp{    /// <summary>    /// 委托    /// </summary>    /// <param name="s1"></param>    /// <param name="s2"></param>    /// <returns></returns>    public delegate string ProcessDelegate<T,S>(T s1, S s2);    class Program    {        static void Main(string[] args)        {            /*  调用方法  */            ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process);            Console.WriteLine(pd("Text1", 100));        }    }    public class Test    {        /// <summary>        /// 方法        /// </summary>        /// <param name="s1"></param>        /// <param name="s2"></param>        /// <returns></returns>        public string Process(string s1,int s2)        {            return s1 + s2;        }    }}

输出的结果就是:
Text1100

三、回调函数

using System;using System.Collections.Generic;using System.Text;namespace TestApp{    /// <summary>    /// 委托    /// </summary>    /// <param name="s1"></param>    /// <param name="s2"></param>    /// <returns></returns>    public delegate string ProcessDelegate(string s1, string s2);    class Program    {        static void Main(string[] args)        {            /*  调用方法  */            Test t = new Test();            string r1 = t.Process("Text1", "Text2", new ProcessDelegate(t.Process1));            string r2 = t.Process("Text1", "Text2", new ProcessDelegate(t.Process2));            string r3 = t.Process("Text1", "Text2", new ProcessDelegate(t.Process3));            Console.WriteLine(r1);            Console.WriteLine(r2);            Console.WriteLine(r3);        }    }    public class Test    {        public string Process(string s1,string s2,ProcessDelegate process)        {            return process(s1, s2);        }        public string Process1(string s1, string s2)        {            return s1 + s2;        }        public string Process2(string s1, string s2)        {            return s1 + Environment.NewLine + s2;        }        public string Process3(string s1, string s2)        {            return s2 + s1;        }    }}

输出结果:
Text1Text2
Text1
Text2
Text2Text1

原创粉丝点击