服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#委托用法详解

C#委托用法详解

2023-02-14 15:11.NET开发菜鸟 C#

本文详细讲解了C#中委托的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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表达式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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作为委托函数参数类型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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种内置泛型委托

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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#委托用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/dotnet261010/p/6052829.html

延伸 · 阅读

精彩推荐
  • C#详解C#编程中一维数组与多维数组的使用

    详解C#编程中一维数组与多维数组的使用

    这篇文章主要介绍了详解C#编程中一维数组与多维数组的使用,包括数组初始化等基础知识的讲解,需要的朋友可以参考下...

    C#教程网5602021-11-09
  • C#C#利用时间和随即字符串创建唯一的订单编号

    C#利用时间和随即字符串创建唯一的订单编号

    本文介绍了利用时间和随机字符串组合生成唯一订单号的示例,从而保证订单号不会重复,希望能够对大家有所帮助。...

    Darren Ji4112021-11-17
  • C#C#三种方法获取文件的Content-Type(MIME Type)

    C#三种方法获取文件的Content-Type(MIME Type)

    这篇文章介绍了C#获取文件Content-Type(MIME Type)的三种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    zhangzongshan5282022-12-16
  • C#C#简单操作MongoDB的步骤全纪录

    C#简单操作MongoDB的步骤全纪录

    最近花了不少时间研究学习了MongoDB数据库的相关知识,下面这篇文章主要给大家介绍了关于C#简单操作MongoDB的相关资料,文中通过示例代码介绍的非常详细...

    陈惊蛰10932022-03-01
  • C#C#关键字async/await用法

    C#关键字async/await用法

    在本篇文章里小编给大家整理的是关于C#关键字async/await用法及相关实例,需要的朋友们学习下。...

    程序杰杰4412022-08-11
  • C#C#语言中的修饰符汇总

    C#语言中的修饰符汇总

    本文主要介绍的是C#语言中的修饰符,主要从四方面介绍,希望对大家有帮助,一起来看。...

    C#教程网9602021-11-01
  • C#C#使用NPOI导入Excel的方法详解

    C#使用NPOI导入Excel的方法详解

    这篇文章主要介绍了C#使用NPOI导入Excel的方法,简单介绍了NPOI的功能及操作Excel的导入、读取等相关技巧,需要的朋友可以参考下...

    布瑞泽的童话7562021-12-31
  • C#C#实现猜数字小游戏

    C#实现猜数字小游戏

    这篇文章主要为大家详细介绍了C#实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    fanxingyue9772022-08-29