C#委托

今天在寻找INVOKE传参方法的时候,网上搜了一堆也没得到一个像样的回答,有人说可以通过委托实现,我是没实现成功,不过顺带把委托复习了一遍,下面是委托相关的知识点。
1、什么是委托

从数据结构来讲,委托是和类一样是一种用户自定义类型。

委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

2、委托的定义

委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

委托的声明原型是
delegate <函数返回类型> <委托名> (<函数参数>)

例子:public delegate void MyDelegate(int number);//定义了一个委托MyDelegate,它可以注册返回void类型且有一个int作为参数的函数

3、委托的实例化

3.1 使用new关键字

委托实例化的原型是
<委托类型> <实例化名>=new <委托类型>(<注册函数>)
例子:MyDelegate _MyDelegate=new MyDelegate(CheckMod);//用函数CheckMod实例化上面的MyDelegate 委托为_MyDelegate

3.2 使用匿名方法

<委托类型> <实例化名>=delegate(<函数参数>){函数体};

3.3 使用Lambda表达式

class Program
    {
        //声明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            //实例化委托
            //1、使用new关键字
            MyDelegate _myDelegate = new MyDelegate(GetSum);

            //2、使用匿名方法
            MyDelegate myDelegate = delegate(int x, int y)
            {
                return x + y;
            };

            //3、使用Lambda表达式
            MyDelegate myDelegateLambda = (int x, int y) => { return x + y; };
        }

        static int GetSum(int x, int y)
        {
            return x + y;
        }
    }

4、泛型委托

委托也支持泛型的使用
泛型委托原型:
delegate <委托名>

namespace DelegateDemo
{
    class Program
    {
        //声明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            //1、Action<T>只能委托必须是无返回值的方法
            Action<string> _action = new Action<string>(SayHello);
            _action("Hello World");

            //2、Fun<TResult>只是委托必须有返回值的方法
            Func<int, bool> _func = new Func<int, bool>(Check);
            _func(5);

            //3、Predicate:此委托返回一个bool值,该委托通常引用一个"判断条件函数"。
            //需要指出的是,判断条件一般为“外部的硬性条件”,比如“大于50”,而不是由数据自身指定,如“查找数组中最大的元素就不适合”。
            Predicate<int> _predicate = new Predicate<int>(Check);
            //使用Lambda表达式
            Predicate<int> predicate = p => p % 2 == 0;
            _predicate(26);
        }

        static void SayHello(string strMsg)
        {
            Console.WriteLine(strMsg);
        }

        //返回值为bool值
        static bool Check(int i)
        {
            if (i % 2 == 0)
            {
                return true;
            }
            return false;
        }       
    }
}

6、多播委托

实例化委托时必须将一个匹配函数注册到委托上来实例化一个委托对象,但是一个实例化委托不仅可以注册一个函数还可以注册多个函数,注册多个函数后,在执行委托的时候会根据注册函数的注册先后顺序依次执行每一个注册函数。

函数注册委托的原型:
<委托类型> <实例化名>+=new <委托类型>(<注册函数>)
例如:MyDelegate _myDelegate+=new MyDelegate(CheckMod);//将函数CheckMod注册到委托实例_checkDelegate上
在.net 2.0开始可以直接将匹配的函数注册到实例化委托:
<委托类型> <实例化名>+=<注册函数>
例如:MyDelegate _myDelegate+=CheckMod;//将函数CheckMod注册到委托实例_myDelegate上

注意:委托必须先实例化以后,才能使用+=注册其他方法。如果对注册了函数的委托实例从新使用=号赋值,相当于是重新实例化了委托,之前在上面注册的函数和委托实例之间也不再产生任何关系。

有+=注册函数到委托,也有-=解除注册

例如:MyDelegate _myDelegate-=CheckMod;

如果在委托注册了多个函数后,如果委托有返回值,那么调用委托时,返回的将是最后一个注册函数的返回值。

namespace DelegateDemo
{
    class Program
    {
        //声明委托
        delegate int MyDelegate(int x, int y);

        static void Main(string[] args)
        {
            MyDelegate _myDelegate = new MyDelegate(fun1);
            _myDelegate += fun2;
            Console.WriteLine(_myDelegate(10,23));

            Console.ReadKey();//输出10,返回最后一个注册函数的返回值
        }

        static int fun1(int x, int y)
        {
            return x + y;
        }

        static int fun2(int x, int y)
        {
            return x;
        }      
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值