文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#委托用法详解

2024-04-02 19:55

关注

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 <T1> <委托名><T1,T2,T3...> (T1 t1,T2 t2,T3 t3...)

例如:delegate T2 DelegateDemo<T1,T2>(T1 t);//定义有两个泛型(T1,T2)的委托,T2作为委托函数返回类型,T1作为委托函数参数类型

static boo Check(int i)
{
     if(i%2==0)

     {

          return true; 

    }

     return false;
}

static void Main(string[] args)
{
      DelegateDemo<int, bool> _delegate =Check;//将泛型委托委托<T1,T2>实例化为<int,bool>,即表示有一个int类型参数且返回类型是bool的函数.
      Console.WriteLine(_delegate(9));//false
}

5、C#内置泛型委托

C#共有3种内置泛型委托

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;
        }
    }
}

到此这篇关于C#委托用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯