C# 关于委托的一点心得

使用委托

按照函数类型定义委托

委托的作用:1、动态调用函数

                2、函数回调和事件机制的基础

    对于有C++经验的人来说,可以把委托理解为函数指针;对于没有C++经验的人来说,委托可以理解为一种特殊的数据类型---函数的类型。

    对于C#来说,和普通的数据类型一样,函数也有类型,只不过函数的类型是通过函数的返回值类型以及参数列表决定的,如果两个函数的返回类型,以及参数的顺序和类型,参数的数量完全相同,那么就可以说这两个函数类型相同。

    那么,就可以用委托来表示某种特定类型的函数,并且可以表示多个函数,使用委托就好像调用这些函数,由于它可以串联多个函数,所以就会按照串联的顺序依次调用这些函数,如果有返回值,那么将返回最后一个函数的返回值。

    委托既然可以理解为一种特定的类型,那么,它实质上是一个类,编译器会根据关键字“delegate”自动从System.Delegate类派生一个类,那么,委托也可以有它的访问修饰符,如private、public等,同业也有它自己的成员。

C#中用关键字“delegate”来定义委托(定义一种数据类型)

Delegate returntype DelegateName(Type1 para1,Type2 para2,…);

用委托动态调用函数

    既然委托可以理解为一种特定的数据类型,那么使用委托跟使用其他数据类型一样,一般分为三个步骤:1、声明委托变量,跟声明普通类型的变量一样。2、为委托变量赋值,委托变量可以看成是一个函数链表,可以通过”=“为函数链表指定唯一函数,也可以通过”+=“为函数链表指定多个函数,还一个通过”-=“从函数链表中删除指定函数。3使用委托变量,像使用函数那样直接使用委托变量,例如定义了一个委托变量voidFunc,那么使用它的时候,直接”voidFunction()“,也可以通过调用委托变量的成员函数”invoke()“来使用委托变量,例如”voidFunc.Invoke()“。

 

用委托传递函数参数

    在使用委托变量的时候指定参数而已。

例子

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace DelegateApp

{

    class Program

    {

        delegate void DSimpleVoidFunc();

        delegate float DFloatFunc(int val1,float val2);

        static void Main(string[] args)

        {

            DSimpleVoidFunc voidfun;   //声明委托变量

            voidfun = PrintHaHa;       //为委托变量赋值

            voidfun();                 //使用委托变量

            voidfun += PrintHeHe;

            voidfun();

            voidfun -= PrintHeHe;

            voidfun.Invoke();

            UseParaDelegate();

           

            Console.ReadLine();

        }

        static void PrintHaHa()

        {

            Console.WriteLine("HaHa...");

        }

        static void PrintHeHe()

        {

            Console.WriteLine("HeHe...");

        }

        static void UseParaDelegate()

        {

            DFloatFunc floatfunc;

            float result;

            floatfunc = Add;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("1. Result={0}",result);

            floatfunc += Sub;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("2. Result={0}", result);

            floatfunc += Mul;

            result = floatfunc(5, 2.0f);

            Console.WriteLine("3. Result={0}", result);

            floatfunc -= Mul;

            floatfunc += Add;

            result = floatfunc.Invoke(5,2.0f);

            Console.WriteLine("4. Result={0}", result);

        }

        static float Add(int val1,float val2)

        {

            Console.WriteLine("{0}+{1}={2}", val1, val2, val1 + val2);

            return val1 + val2;

        }

        static float Sub(int val1,float val2)

        {

            Console.WriteLine("{0}-{1}={2}", val1, val2, val1 - val2);

            return val1 - val2;

        }

        static float Mul(int val1,float val2)

        {

            Console.WriteLine("{0}*{1}={2}", val1, val2, val1 * val2);

            return val1 * val2;

        }

    }

}

 

C# 关于委托的一点心得

上一篇:c#浅谈反射内存的处理


下一篇:vB SendMessage API 简单用法