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#调用动态库之前,有几个基本概念需要先了解一下: 动态链接库:一种特殊的库,不像静态链接库那样包含在可执行文件中,而是在程序运行时才会加载,也称为共享库。 调用规范:在C函数传递参数的过程中,有多种规范,包括std…

    C# 2023年5月14日
    00
  • C# 中用 Sqlparameter 的两种用法

    C#中使用SqlParameter是避免SQL注入攻击的重要手段之一,SqlParameter可以在传递参数的时候对参数值进行格式化和安全验证,保证代码的安全性和稳定性。下面将分别介绍SqlParameter的两种用法。 用法一:SqlParameter构造函数传参 SqlParameter类构造函数可以通过直接传递参数的形式,将参数名和参数类型传递给Sql…

    C# 2023年5月15日
    00
  • 探究C#访问null字段会抛异常原因

    探究C#访问null字段会抛异常原因 在C#中,当我们试图访问一个为空的引用类型字段(即null值)时,就会抛出NullReferenceException异常。本文将深入探究这种情况的原因。 什么是NullReferenceException? 在C#中,我们通常使用null表示一个空引用类型对象,意思是这个对象并不存在。如果我们在对一个空引用类型对象的成…

    C# 2023年5月15日
    00
  • C# ling to sql 取多条记录最大时间

    使用C# Ling to sql进行查询时,有时需要取多条记录中的最大时间。有以下两种方法可以实现此功能: 方法一:使用Max方法 使用Linq中的Max方法可以查询出多条记录中的最大时间。示例代码如下: using (var context = new MyDataContext()) { var maxTime = context.MyTable .Ma…

    C# 2023年6月1日
    00
  • C#编写一个网游客户端的完整步骤

    下面是详细的C#编写一个网游客户端的完整步骤攻略: 一、前期准备 1. 选择游戏引擎 选择一个合适的游戏引擎是开发网游客户端的必要前提。市面上比较知名的游戏引擎包括Unity、Unreal Engine、Cocos2D等,选择合适的引擎需要考虑开发团队的技术能力、游戏类型等因素。 2. 学习网络编程基础 了解网络编程基础,包括基本的网络协议、Socket编程…

    C# 2023年5月15日
    00
  • C#中的LINQ to Objects详解(2)

    C#中的LINQ to Objects详解(2) 什么是LINQ to Objects LINQ to Objects是针对C#中的对象(包括集合、类等)进行查询和操作的一种语言集成查询方式。它提供了一组标准的查询操作符,可以对对象进行所需的查询和处理操作,支持查询、筛选、排序、分组、连接等多种数据操作。 如何使用LINQ to Objects 使用LINQ…

    C# 2023年6月1日
    00
  • WPF如何自定义TabControl控件样式示例详解

    下面是针对“WPF如何自定义TabControl控件样式示例详解”的攻略: 一、介绍 TabControl是很常用的WPF控件之一,用于在多个标签页中显示不同的内容。虽然TabControl自带的样式可以满足一般的需求,但有时候我们会想自定义TabControl的外观来符合特定的界面设计。本文将着重讲解如何自定义TabControl控件样式。 二、预备知识 …

    C# 2023年6月6日
    00
  • C#实现老板键功能的代码

    当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用C#来实现老板键功能的代码。 1. 原理 老板键功能的实现原理是通过监听操作系统的键盘事件,当监听到我们设定的快捷键时,就会触发我们的代码来执行指定的操作,…

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