C#中的委托

Posted qingyishoujiuren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中的委托相关的知识,希望对你有一定的参考价值。

一.什么是委托

C#中的委托可以理解为对函数的包装,它使得C#中的函数可以作为参数被传递;委托的定义与方法的定义类似,只是在定义的前面多了一个delegate关键字,如下所示:

public delegate void MyDelegate(int para1, string para2);

委托能包装的方法是有一定限制的,例如能被前面的委托类型MyDelegate包装的方法需要满足以下条件:

(1).方法的返回类型必须为void;

(2).方法必须有两个参数,并且第一个参数应为int类型,第二个参数为string类型。

归纳起来,可以被委托包装的方法必须满足以下规则:

(1).方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序;

(2).方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分。

二.委托的使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate

    class Program
    
        //使用delegate关键字来定义一个委托类型
        public delegate void MyDelegate(int para1, int para2);
        static void Main(string[] args)
        
            //声明委托变量d
            MyDelegate d;
            //实例化委托类型
            d = new MyDelegate(new Program().Add);
            //委托类型作为参数传递给另一个方法
            MyMethod(d);
            Console.ReadKey();
        

        void Add(int para1, int para2)
        
            int sum = para1 + para2;
            Console.WriteLine("两个数的和为:"+sum);
        

        //方法的参数类型是委托类型
        private static void MyMethod(MyDelegate mydelegate)
        
            //在方法中调用委托
            mydelegate(1, 2);
        
    

 三.委托的使用步骤

(1).定义委托类型:delegate void MyDelegate(type para1, type para2);其定义类似于方法的定义,只是多了一个delegate关键字;

(2).声明委托类型变量:MyDelegate d;既然委托是一种类型,那么可以使用委托来声明一个委托变量。

(3).实例化委托:d=new MyDelegate(obj.InstanceMethod);第二步只是声明了委托变量,但并没有将它实例化,类的实例化使用new关键字实现,而委托也属于类类型,所以委托的实例化也使用new关键字来进行,委托的实例化是用一个方法名(不能带左右括号)作为参数,并且该方法的定义必须符合委托的定义,即该方法的返回类型、参数个数和类型必须与委托定义中的一样。

(4).作为参数传递给方法:MyMethod(d);委托使得C#中,可以把一个方法作为另一个方法的参数,而委托可以看作是一个包装方法的对象。

(5).在方法中调用委托,MyMethod方法先调用委托,委托再调用方法InstanceMethod。

四.委托链的使用

C#中的委托也同样可以封装多个方法,C#中把封装多个方法的委托称作委托链或多路广播委托,且委托链中的方法的的返回值、参数类型,顺序也必须保持一致。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MultipleDelegate

    class Program
    
        //声明一个委托类型
        public delegate void DelegateTest();
        static void Main(string[] args)
        
            //用静态方法来实例化委托
            DelegateTest de1 = new DelegateTest(Program.method1);

            DelegateTest de2 = new DelegateTest(new Program().method2);

            //定义一个委托对象,一开始初始化为null,即不代表任何方法
            DelegateTest de = null;

            //使用“+”符号链接委托,链接多个委托后就成了委托链
            de += de1;
            de += de2;

            //调用委托链
            de();

            Console.ReadKey();
        

        //静态方法
        private static void method1()
        
            Console.WriteLine("这是静态方法");
        

        //实例方法
        private void method2()
        
            Console.WriteLine("这是实例方法");
        

    

五.从委托链中移除委托

既然能用“+”运算符把委托链接到一个委托对象实例上,自然也可以使用“-”运算符将某个委托从委托链对象上移除。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MultipleDelegate

    class Program
    
        //声明一个委托类型
        public delegate void DelegateTest();
        static void Main(string[] args)
        
            //用静态方法来实例化委托
            DelegateTest de1 = new DelegateTest(Program.method1);

            DelegateTest de2 = new DelegateTest(new Program().method2);

            //定义一个委托对象,一开始初始化为null,即不代表任何方法
            DelegateTest de = null;

            //使用“+”符号链接委托,链接多个委托后就成了委托链
            de += de1;
            de += de2;

            //使用“-”运算符把de1从委托链中移除
            de -= de1;

            //调用委托链
            de();

            Console.ReadKey();
        

        //静态方法
        private static void method1()
        
            Console.WriteLine("这是静态方法");
        

        //实例方法
        private void method2()
        
            Console.WriteLine("这是实例方法");
        

    

 

以上是关于C#中的委托的主要内容,如果未能解决你的问题,请参考以下文章

C#中的委托

C# 中的委托和事件

C#中的委托

C# 中的委托数组

C#中的委托和事件

C#中的委托是啥?事件是否一种委托?