C#委托用法详解

 更新时间:2022年02月24日 11:33:14   作者:.NET开发菜鸟  
本文详细讲解了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表达式

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#委托用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • winform实现关闭按钮失效的两种方法

    winform实现关闭按钮失效的两种方法

    这篇文章主要介绍了winform实现关闭按钮失效的两种方法,实例分析了WinForm实现关闭按钮失效的原理与所涉及的相关技巧,需要的朋友可以参考下
    2015-09-09
  • asp.net core 使用 tensorflowjs实现 face recognition的源代码

    asp.net core 使用 tensorflowjs实现 face recognition的源代码

    tensorflowjs,在该项目中使用了ml5js这个封装过的机器学习JavaScript类库, 使用起来更简单,本文给大家分享asp.net core 使用 tensorflowjs实现 face recognition的源代码,需要的朋友参考下吧
    2021-06-06
  • c#的dataset离线数据集示例

    c#的dataset离线数据集示例

    这篇文章主要介绍了c#的dataset离线数据集示例,需要的朋友可以参考下
    2014-04-04
  • c# socket心跳超时检测的思路(适用于超大量TCP连接情况下)

    c# socket心跳超时检测的思路(适用于超大量TCP连接情况下)

    这篇文章主要介绍了c# socket心跳超时检测的思路(适用于超大量TCP连接情况下),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • 详解如何在C#中使用投影(Projection)

    详解如何在C#中使用投影(Projection)

    这篇文章主要介绍了详解如何在C#中使用投影(Projection),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C#中各种类型集合的特点详解

    C#中各种类型集合的特点详解

    这篇文章主要介绍了概述C#中各种类型集合的特点,这些集合通常位于 System.Collections 和 System.Collections.Generic 命名空间中,下面我将概述C#中几种常用的集合类型及其特点,需要的朋友可以参考下
    2024-08-08
  • 利用WPF实现Windows屏保的制作

    利用WPF实现Windows屏保的制作

    屏保程序的本质上就是一个Win32 窗口应用程序。本文将利用WPF实现Windows屏保的制作,文中的示例代码简洁易懂,对我们学习WPF有一定帮助,感兴趣的可以了解一下
    2022-07-07
  • c# 类型转换

    c# 类型转换

    CLR最重要的特性之一就是类型安全性。在运行时,CLR总是知道一个对象是什么类型。调用GetType方法可以返回类型
    2012-10-10
  • C#根据反射和特性实现ORM映射实例分析

    C#根据反射和特性实现ORM映射实例分析

    这篇文章主要介绍了C#根据反射和特性实现ORM映射的方法,实例分析了反射的原理、特性与ORM的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • vs代码段快捷键设置(图文)

    vs代码段快捷键设置(图文)

    学习代码快捷键是程序员必学知识点,会使用代码快捷在程序开发过程中会提高开发效率,下面小编给大家整理些有关vs代码段快捷键设置的技巧,需要的朋友可以参考下
    2015-08-08

最新评论