C#基础知识学习之 ✨ “精神小伙“——委托(delegate) 的含义和用法

简介: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。 委托(Delegate)是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 委托就是用来储存方法的结构委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

C#委托(Delegate)

在C#的学习过程中,自然有我们的精神小伙——委托 的一席之地

本文就介绍一下C#中的委托,这位可以包含同类方法函数的小伙子


C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。 委托(Delegate)

是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 委托就是用来储存方法的结构

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。


声明和定义委托分为4个步骤

声明一个委托(函数指针)

创建委托对象

创造符合委托格式的函数(指针指向的函数)

将函数名称赋值给委托

Tips:委托对象为空是不能执行的,执行前先提前判断


代码实例如下

// 1. 声明一个委托(函数指针)
delegate void delegateTest(int a,float b);
// delegate 返回值类型 委托类型名(参数列表):
// 2. 创建委托对象 
public delegateTest dT1;
//3. 创造符合委托格式的函数(指针指向的函数)
public void Test(int a,float b)
{
    a+=100;
    b*=2.0;
    Console.WriteLine("a:{0},b:{1}", a,b);
}
 static void Main(string[] args)
{
    // 4.  将函数名称赋值给委托
    dT1=new delegateTest(Test);
    //使用委托
    dT1(1,1.0);
    //打印结果
    //a=101,b=2.0
}

委托类型


委托/代理:句柄

委托是自定义类型

委托是引用类型

几种基础的委托结构


自定义委托 语法: delegate 返回类型 委托名([参数]);

Action内置委托 语法: Action<[参数类型0-16个]> 委托名=被委托方法名;

Func内置委托 语法: Function<[参数类型0-16个],返回类型> 委托名=被委托方法名;

多播委托 语法:委托名+=被委托方法名;委托名-=被委托方法名;

委托的用法

下面的实例演示了委托的一个用法,可以将定义的委托作为参数,就可以直接通过委托来调用委托中的方法了

//声明委托
public delegate void OndelegateTest(int a,int b);
       public static void TestNum1(int i,int j)
      {
         int num = i+j;
         Console.WriteLine("num:"+num);
      }
       public static void TestNum2(int i,int j)
      {
         int num = i*j;
         Console.WriteLine("num:"+num);
      }
      // 该方法把委托作为参数,并使用它调用方法
      public static void sendNum(OndelegateTest test)
      {
         test(1,2);
      }
static void Main(string[] args)
 {
      OndelegateTest d1=new OndelegateTest(TestNum1);
      OndelegateTest d2=new OndelegateTest(TestNum2);
      sendNum(d1);
      sendNum(d2);
      Console.ReadKey();
 }

委托的多播(Multicasting of a Delegate)

委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。


使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面的程序演示了委托的多播:

using System;
//声明委托
delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }
      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
       public static int TestNum(int i)
      {
         num -= i;
         return num;
      }
      public static int getNum()
      {
         return num;
      }
      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         nc += TestNum;
         // 调用多播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 70

委托对象的绑定与解绑

     delegate int NumberChanger(int n);
     NumberChanger nc;
     public static int TestNum(int i)
      {
         num -= i;
         return num;
      }
     nc += TestNum;//委托的绑定
     nc -= TestNum;//委托的解绑
相关文章
|
4天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
2月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
113 7
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
91 2
|
3月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
63 4
|
3月前
|
C#
C#中的委托(一)
C#中的委托(一)
37 1
|
3月前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
49 0
|
3月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
|
13天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
28 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
101 0