C#中的delegate委托类型基本学习教程

下面我将为你讲解C#中的delegate委托类型基本学习教程的完整攻略。

什么是delegate(委托)类型?

delegate(委托)是C#的一个重要部分,在GUI开发和事件处理等应用中起着至关重要的作用。delegate(委托)类型可以看作是一个函数指针,使程序员能够在运行时动态地关联一个或多个方法到一个委托实例上,并将委托实例作为参数来传递和调用一个方法。

delegate(委托)的声明语法

delegate 委托返回类型 委托名称(参数列表);

委托返回类型:指向方法的返回值类型。

委托名称:当前委托类型的名称

参数列表:用于定义该委托所引用的方法的参数列表

delegate(委托)的实例化

delegate(委托)实例可以理解为函数指针数组,其中每个元素都可以指向一个方法或一组方法。delegate(委托)的实例化有多种方法,最常用的方法是使用“new”关键字并提供一个方法名称或使用匿名方法,具体方法如下:

实例化委托方法1:使用“new”关键字和方法名称

delegate void MyDelegate(string text);  // 声明一个委托类型
class MyClass
{
    public static void MyMethod(string text)
    {
        Console.WriteLine(text);
    }
    public static void Main()
    {
        MyDelegate myDelegate = new MyDelegate(MyMethod);  // 实例化委托对象,将MyMethod方法添加到委托中
        myDelegate("使用new关键字和方法名称实例化委托");  // 调用委托
    }
}

实例化委托方法2:使用匿名方法

delegate void MyDelegate(string text);  // 声明一个委托类型
class MyClass
{
    public static void Main()
    {
        MyDelegate myDelegate = delegate(string text)  // 实例化委托,使用匿名方法
        {
            Console.WriteLine(text);
        };
        myDelegate("使用匿名方法实例化委托");  // 调用委托
    }
}

delegate(委托)的多播(Multicast)

由于delegate(委托)实例可以理解为函数指针数组,所以它们支持多播(Multicast),即将一个或多个委托实例组合成一个委托实例。调用多播委托时,它将按委托数组中的顺序以同样的参数调用每个委托实例,示例如下:

delegate void MyDelegate(string text);  // 声明一个委托类型
class MyClass
{
    public static void MyMethod1(string text) { Console.WriteLine(text + " 1"); }
    public static void MyMethod2(string text) { Console.WriteLine(text + " 2");}
    public static void Main()
    {
        MyDelegate myDelegate1 = new MyDelegate(MyMethod1);
        MyDelegate myDelegate2 = new MyDelegate(MyMethod2);

        MyDelegate myDelegate3 = myDelegate1 + myDelegate2;  // 将myDelegate1和myDelegate2合并为一个多播委托实例

        myDelegate3("调用多播委托");  // 调用多播委托
    }
}

以上代码将输出:

调用多播委托 1
调用多播委托 2

小结

delegate(委托)类型是C#的一个重要部分,允许程序员动态地指定一个或多个方法,并将它们作为一个实例传递和调用。委托实例可以看作是函数指针数组,允许使用多播(Multicast)。委托类型在GUI开发和事件处理等应用中起着至关重要的作用。

示例一:实现按钮的回调函数

using System;
namespace DelegateDemo
{
    public delegate void ClickEventHandler(string controlName);
    //定义ClickEventHandler委托
    interface IButton
    {
        void Click();
        event ClickEventHandler ClickEvent;
    }
    class Button : IButton
    {
        private string controlName;

        public Button(string name)
        {
            controlName = name;
        }
        public void Click()
        {
            if (ClickEvent != null)
            {
                ClickEvent(controlName);
            }
        }

        public event ClickEventHandler ClickEvent;
    }
    class Program
    {
        static void Main(string[] args)
        {
            IButton sbt = new Button("Submit");
            sbt.ClickEvent += new ClickEventHandler(ReactClick);
            sbt.Click();
            Console.ReadKey();
        }

        public static void ReactClick(string controlName)
        {
            Console.WriteLine(controlName+" button clicked!");
        }
    }
}

运行结果:

Submit button clicked!

示例二:多播委托能否避免对象空引用异常

using System;
namespace DelegateDemo
{
    class Program
    {
        delegate void Hello();
        static void Main(string[] args)
        {
            Hello x, y, z;
            x = Hello1; //委托x指向Hello1方法
            y = Hello2; //委托y指向Hello2方法
            z = x + y;  //多播委托z由委托x和y组成

            Console.WriteLine("Invoking delegate x:");
            x();

            Console.WriteLine("Invoking delegate y:");
            y();

            Console.WriteLine("Invoking delegate z:");
            z(); //当调用多播委托时,先执行Hello1的方法,再执行Hello2的方法

            Console.ReadKey();
        }
        static void Hello1()
        {
            Console.WriteLine("Hello from 1");
        }

        static void Hello2()
        {
            Console.WriteLine("Hello from 2");
        }
    }
}

运行结果:

Invoking delegate x:
Hello from 1
Invoking delegate y:
Hello from 2
Invoking delegate z:
Hello from 1
Hello from 2

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的delegate委托类型基本学习教程 - Python技术站

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

相关文章

  • 简单聊聊c# 事件

    好的。首先,我将介绍C#中的事件。事件是一种声明,当特定动作发生时,事件会在代码中触发。例如,可以在单击按钮时触发单击事件,或者在完全加载页面时触发加载事件。在事件被触发时,可以调用与事件相关的代码,以提供所需的功能。 在C#中,我们可以通过声明delegate类型来定义事件。delegate类型是一种数据类型,它引用一个方法,该方法可以用于处理事件的调用。…

    C# 2023年6月1日
    00
  • .NET Core获取配置文件内容

    在.NET Core中,我们可以使用Configuration API来获取配置文件内容。在本攻略中,我们将详细讲解如何使用Configuration API来获取配置文件内容,并提供两个示例说明。 添加配置文件:首先,我们需要在.NET Core项目中添加配置文件。我们可以在项目的根目录下创建一个名为appsettings.json的文件,并在该文件中添加…

    C# 2023年5月16日
    00
  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析

    ASP.NET Core MVC 修改视图的默认路径及其实现原理解析 在ASP.NET Core MVC中,视图是用于呈现HTML内容的模板。默认情况下,视图文件存储在/Views文件夹中。但是,有时候需要将视图文件存储在不同的位置,例如在多个项目之间共享视图文件。本攻略将介绍如何修改ASP.NET Core MVC中视图的默认路径,并解析其实现原理。 步骤…

    C# 2023年5月17日
    00
  • 深入.net调用webservice的总结分析

    《深入.NET调用Web Service的总结分析》是一篇介绍.Net平台下调用Web服务的文章。其内容主要包括Web服务的概念介绍、使用.Net框架下的方式调用Web服务的具体步骤、调用WebService是需要注意的问题等。 概述 Web服务(Web service)是指通过Internet对外提供的可以被远程应用程序调用的程序接口。在.Net平台下可以…

    C# 2023年6月6日
    00
  • c# 使用谷歌身份验证GoogleAuthenticator的示例

    当需要进行双因素身份验证时,Google身份验证器是一种非常流行的选择。C#可以使用GoogleAuthenticator库来实现Google身份验证器。下面是使用GoogleAuthenticator的示例攻略: 步骤一:安装GoogleAuthenticator库 安装GoogleAuthenticator库的推荐方法是通过NuGet包安装。可以通过以下…

    C# 2023年6月1日
    00
  • ASP.NET Core使用EF SQLite对数据库增删改查

    ASP.NET Core可以通过EF SQLite对SQLite数据库进行增删改查的操作。下面是详细的攻略: 1. 创建ASP.NET Core Web应用程序 首先,我们需要在Visual Studio中创建一个ASP.NET Core Web应用程序。在创建项目的过程中,请选择ASP.NET Core Web应用程序模板,并选择Web应用程序的选项。 2…

    C# 2023年5月31日
    00
  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    ASP.NET Core是一个开源的Web框架,支持多种平台,包括Windows、macOS和Linux等。在ASP.NET Core中,使用Entity Framework(EF)来操作数据库,可以很方便地进行数据的增删改查等操作。本文将详细介绍ASP.NET Core使用EF保存数据、级联删除和事务使用的完整攻略,同时附带两个示例说明。 一、ASP.NE…

    C# 2023年6月3日
    00
  • C#异步方法返回void与Task的区别详解

    C#异步方法返回void与Task的区别详解 前言 在C#中使用异步方法,我们通常会使用async和await关键字,这些关键字使得异步编程看起来更加简单,但是如果对异步编程的底层原理不了解,就很容易用错异步方法的返回类型。本文将详细讲解C#异步方法返回void和Task的区别。 异步方法返回void的问题 在C#中,我们可以定义一个异步方法返回类型为voi…

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