深入理解C#中常见的委托

深入理解C#中常见的委托

委托的定义

委托(Delegate)是一种类型,它可以封装一个方法,使该方法像一个对象实例一样被传递。委托可以像其他任何对象一样进行实例化和调用,其实质是把方法作为参数进行传递和执行。在C#当中,定义委托类型需要使用delegate关键字:

delegate void MyDelegate(int param);

以上代码定义了一个名为MyDelegate的委托,该委托可以封装一个返回值类型为void,有一个int类型的参数的方法。

使用委托

  1. 实例化委托

我们可以像实例化对象一样实例化一个委托,并把一个方法作为参数传递给委托进行封装。

class Program
{
    delegate void MyDelegate(int param);
    static void Main(string[] args)
    {
        MyDelegate myDelegate = new MyDelegate(Method1);
        myDelegate(100);    //调用委托实例化的方法
    }
    static void Method1(int param)
    {
        Console.WriteLine("这是方法Method1,传入的参数为{0}", param);
    }
}

此时,程序将会输出:

这是方法Method1,传入的参数为100
  1. 多播委托

多播委托是指一个委托可以封装多个方法,这样当调用该委托时,所有封装的方法都会被依次执行。在C#中,多播委托使用+运算符来进行多个方法的封装。同时,-运算符来解除单个方法的封装或者解除完全封装。

class Program
{
    delegate void MyDelegate(int param);
    static void Main(string[] args)
    {
        MyDelegate myDelegate1 = new MyDelegate(Method1);
        MyDelegate myDelegate2 = new MyDelegate(Method2);
        MyDelegate myDelegate = myDelegate1 + myDelegate2;
        myDelegate(100);    //调用委托实例化的方法
        Console.WriteLine("-----------------");

        myDelegate = myDelegate - myDelegate2;
        myDelegate(200);    //调用委托实例化的方法
        Console.WriteLine("-----------------");

        myDelegate -= myDelegate1;
        myDelegate(300);    //调用委托实例化的方法
    }
    static void Method1(int param)
    {
        Console.WriteLine("这是方法Method1,传入的参数为{0}", param);
    }
    static void Method2(int param)
    {
        Console.WriteLine("这是方法Method2,传入的参数为{0}", param);
    }
}

在以上示例中,我们定义了两个方法Method1和Method2,然后我们通过实例化委托的方式将这两个方法封装到了实例化的委托中。接着,我们使用+运算符进行多个方法的封装,并使用-运算符进行单个方法的解除封装。最终,我们使用-=运算符解除所有封装,此时多播委托将会被设置为null,因此,调用其方法时将不会有任何输出。

在以上示例中,程序的输出为:

这是方法Method1,传入的参数为100
这是方法Method2,传入的参数为100
-----------------
这是方法Method1,传入的参数为200
-----------------

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解C#中常见的委托 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • jQuery $.get 的妙用 访问本地文本文件

    下面是关于“jQuery $.get的妙用访问本地文本文件”的完整攻略,包含两个示例。 1. jQuery $.get访问本地文本文件简介 在Web开发中,我们经常需要访问本地文本文件。使用jQuery的$.get方法可以轻松地访问本地文本文件。$.get方法是jQuery中的一个AJAX方法,可以用于从服务器加载数据。在本地文件中,我们可以使用$.get方…

    C# 2023年5月15日
    00
  • asp.net 获取系统中参数的实现代码

    要获取系统中的参数,我们可以使用 ASP.NET 提供的 System.Web.Configuration 命名空间中的 ConfigurationSettings、AppSettings 和 ConnectionStrings 类。 1. 使用 ConfigurationSettings 类 ConfigurationSettings 类提供一种获取应用程…

    C# 2023年5月31日
    00
  • 如何运行编译.NetCore的源码?

    作为.net的开发人员,为了能更好的code,我们要知其然并知其所以然,了解.netcore的源码是我们的基本素养✊ 源码地址 .NET Platform (github.com) 这个是.net在github上开源的源码地址aspnetcore 这个是.netcore的源码地址runtime 这个是运行时的源码地址,有些.netcore源码会依赖此运行时(…

    C# 2023年4月24日
    00
  • C# Path.GetFullPath()方法: 获取指定路径的完整路径

    Path.GetFullPath() 方法的作用是将一个相对路径转换为完整的绝对路径,同时解析出该路径中的特殊字符和符号链接。 Path.GetFullPath() 方法有两个重载形式: public static string GetFullPath(string path); public static string GetFullPath(string…

    C# 2023年4月19日
    00
  • C#将html table 导出成excel实例

    下面是关于“C#将html table 导出成excel实例”的完整攻略。 1. 环境准备 在使用C#将HTML表格导出为Excel之前,需要确保安装并引用以下两个库: EPPlus :一个用于创建和读取Excel的开源库,可在 Nuget 上查找和安装。 HtmlAgilityPack: 一个用于处理HTML文档的开源库,可在 Nuget 上查找和安装。 …

    C# 2023年6月2日
    00
  • ASP.Net Core3.0中使用JWT认证的实现

    ASP.NET Core 3.0中使用JWT认证的实现攻略如下: 安装必要的NuGet包 在开始之前,需要安装以下NuGet包: Microsoft.AspNetCore.Authentication.JwtBearer System.IdentityModel.Tokens.Jwt 您可以使用以下命令在命令行中安装这些NuGet包: dotnet add …

    C# 2023年5月16日
    00
  • 在Unity中实现动画的正反播放代码

    下面是在Unity中实现动画的正反播放代码的完整攻略。 1. 实现动画正播放 要在Unity中实现动画的正播放,首先需要将动画文件添加到项目中。可以通过在“Project”窗口中右键单击,选择“Import New Asset”选项,然后选择要添加的动画文件。 接下来,在场景中选择要添加动画的对象,然后拖动动画文件到对象的“Animator”组件上。此时,可…

    C# 2023年6月3日
    00
  • C#通过接口与线程通信(捕获线程状态)示例代码

    C#通过接口与线程通信(捕获线程状态)示例的完整攻略如下: 线程状态概述 在进行线程通信之前,先要理解线程的状态。在 C# 中,线程有以下几种状态: Unstarted: 表示线程已被创建,但未开始执行。 Running: 表示线程正在运行。 Stopped: 表示线程已经停止。 WaitSleepJoin: 表示线程正在等待被调用,或正在进行 Wait、S…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部