c#软件开发学习笔记--委托

C# 委托简述 使用关键字delegate声明委托除了使用delegate定义 委托以外C#提供两个定义好的泛型委托Action与Func) (当然你也可以使用delegate自定义泛型委托)这里先介绍两个C#定义的委托,相信很多人都在使用,不管你清不清楚什么是委托Action:是无返回值的泛型委托。下面action 表示无参,无返回值的委托//定义委托action();//使用方式1//使用方式2Console.WriteLine("我是传入的无参无返回值的委托方法"); 阅读详情

c#软件开发学习笔记


一、委托概述

1.1 定义与本质

委托(Delegate) 是一种引用类型,用于存储函数(方法)的引用。它就像一个"函数类型"的变量,可以存储、传递和调用方法。

// 定义委托类型
public delegate void MyDelegate();
public delegate int CalculateDelegate(int a, int b);

核心特性:

  • 委托是类型安全的函数指针
  • 所有委托都派生自 System.Delegate 类
  • 用于实现事件和回调方法

1.2 委托的作用

应用场景说明
回调机制将方法作为参数传递,实现延迟执行
事件处理GUI编程中处理用户操作(点击、按键等)
策略模式运行时动态选择算法
异步编程处理异步操作的完成通知

二、委托的声明与实例化

2.1 委托声明语法

// 语法格式:访问修饰符 delegate 返回值类型 委托名(参数列表)
public delegate void MyDelegate1();                    // 无参数无返回值
public delegate void MyDelegate2(string message);       // 带参数无返回值
public delegate int MyDelegate3(int a, int b);          // 带参数有返回值

2.2 委托实例化方式

方式一:使用 new 关键字
public delegate int CalculateDelegate(int a, int b);

class Calculator
{
    public int Add(int a, int b) => a + b;
    public int Subtract(int a, int b) => a - b;
}

// 实例化委托
Calculator calc = new Calculator();
CalculateDelegate addDelegate = new CalculateDelegate(calc.Add);
方式二:直接赋值(简写形式)
CalculateDelegate subDelegate = calc.Subtract;  // 编译器自动推断
方式三:使用 Invoke 方法调用
int result = addDelegate.Invoke(10, 20);  // 等价于 addDelegate(10, 20)

2.3 完整示例

delegate void MyDel(int v1, string v2);
delegate int Number(int v1, int v2);

class Program
{
    static void Main()
    {
        Number addDelegate = new Number(Add);
        Console.WriteLine(addDelegate(10, 10));  // 输出:20
        
        // 简写形式
        Number subDelegate = Sub;
        Console.WriteLine(subDelegate(200, 10)); // 输出:190
    }
    
    static int Add(int a, int b) => a + b;
    static int Sub(int a, int b) => a - b;
}

三、多播委托(Multicast Delegate)

3.1 概念

一个委托变量可以存储多个方法,称为多播委托。使用 += 添加方法,使用 -= 移除方法。

3.2 基本操作

delegate void MyDel(string s);

class Program
{
    static void Main()
    {
        // 创建多播委托
        MyDel multiDelegate = Fn1;
        multiDelegate += Fn2;
        multiDelegate += Fn3;
        
        // 调用委托,所有绑定的方法都会执行
        multiDelegate("Hello");
        
        // 移除方法
        multiDelegate -= Fn2;
        
        // 再次调用,只执行 Fn1 和 Fn3
        multiDelegate("World");
    }
    
    static void Fn1(string s) => Console.WriteLine($"Fn1: {s}");
    static void Fn2(string s) => Console.WriteLine($"Fn2: {s}");
    static void Fn3(string s) => Console.WriteLine($"Fn3: {s}");
}

3.3 重要注意事项

问题:移除实例方法时的陷阱

// 错误示例:每次 new Test() 创建不同对象
MyDel m = Fn1;
m += new Test().Fn2;
m -= new Test().Fn2;  // ❌ 无法移除,因为不是同一个对象引用

// 正确方法1:保存对象引用
MyDel m1 = Fn1;
Test t = new Test();
m1 += t.Fn2;
m1 -= t.Fn2;  // ✅ 成功移除

// 正确方法2:使用静态方法
MyDel m2 = Fn1;
m2 += Test.Fn3;
m2 -= Test.Fn3;  // ✅ 成功移除

3.4 空委托处理

MyDel myDelegate = null;

// 方法1:条件判断
if (myDelegate != null)
{
    myDelegate("Hello");
}

// 方法2:空条件运算符(推荐)
myDelegate?.Invoke("Hello");

四、内置委托

C# 提供了三种常用的内置委托类型,无需手动定义:

4.1 Action 委托

用途:无返回值的方法

签名说明
Action无参数无返回值
Action<T>1个参数无返回值
Action<T1, T2>2个参数无返回值
Action<T1, T2, ..., T16>最多16个参数
static void Process(Action<int> action)
{
    action?.Invoke(10);
}

// 使用
Process(v => Console.WriteLine($"Value: {v}"));

4.2 Func 委托

用途:有返回值的方法

签名说明
Func<TResult>无参数,返回 TResult
Func<T, TResult>1个参数,返回 TResult
Func<T1, T2, TResult>2个参数,返回 TResult
Func<T1, ..., T16, TResult>最多16个参数
static void Calculate(Func<int, int, int> calculator)
{
    int result = calculator(10, 20);
    Console.WriteLine($"Result: {result}");
}

// 使用
Calculate((a, b) => a + b);  // 输出:30

4.3 Predicate 委托

用途:返回布尔值的判断方法

static int FindFirst(int[] arr, Predicate<int> condition)
{
    foreach (int item in arr)
    {
        if (condition(item))
            return item;
    }
    return -1;
}

// 使用
int[] numbers = { 1, 3, 5, 7, 9 };
int even = FindFirst(numbers, v => v % 2 == 0);

4.4 选择建议

场景推荐委托
无返回值Action
有返回值Func
条件判断Predicate 或 Func<T, bool>

五、泛型委托

5.1 定义泛型委托

// 泛型委托类型
public delegate bool CallBack<T>(T value);

5.2 泛型委托的优势

  • 类型安全:编译时检查类型匹配
  • 代码复用:一套代码处理多种类型
  • 性能优化:避免装箱拆箱

5.3 完整示例:泛型查找方法

// 泛型委托
public delegate bool CallBack<T>(T v);

class MyArray
{
    // 泛型查找方法
    public static T Find<T>(T[] arr, CallBack<T> callback)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            if (callback(arr[i]))
            {
                return arr[i];
            }
        }
        return default(T);  // 返回类型默认值
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        int[] numbers = { 1, 23, 32, 21 };
        Console.WriteLine(MyArray.Find(numbers, v => v % 2 == 0));  // 输出:32
        
        string[] names = { "吴亦凡", "罗志祥", "李云迪" };
        Console.WriteLine(MyArray.Find(names, v => v.StartsWith("罗")));  // 输出:罗志祥
    }
}

六、Lambda 表达式

6.1 概念

Lambda 表达式是一种匿名函数,提供简洁的语法来创建委托实例。

6.2 语法格式

// 完整语法
(参数列表) => { 函数体 }

// 简写形式
(参数) => 表达式  // 单个表达式可省略 {} 和 return

6.3 简写规则

规则示例
省略参数类型(a, b) => a + b
单参数省略括号a => a * 2
单表达式省略花括号a => a * 2

6.4 实际应用

int[] numbers = { 19, 19, 20, 3, 18 };

// 使用 Lambda 作为参数
int firstEven = Array.Find(numbers, v => v % 2 == 0);  // 输出:20

// 复杂条件
string[] names = { "吴亦凡", "罗志祥", "郑爽" };
string result = Array.Find(names, v => v.EndsWith("祥") && v.Length == 3);

c# 委托 关键字:Delegate 学习笔记 生活中是不是经常需要拜托别人帮忙做一件事情? 比如:工作中,客户反馈系统有一个bug,但是你手头上还有很多工作没做完,就需要拜托有时间的同事帮忙解决一下 这就是委托了 定义委托(就是我现在有一个改bug的工作要处理)——声明一个和委托类型一模一样的方法(拜托同事帮忙改bug)—— 执行委托(同事接受我的委托,开始处理bug)注意:委托类型和方法类型必须是一样的,因为要处理同样类型的事情,否... 阅读详情

相关推荐

C#委托和事件

C#委托和事件 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:C# 作者:吴锦华 撰写时间:2021/10/28 一、委托的概念 委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。 在 C# 语言中,委托则委托某个方法来实现具体的功能。 委托的特点: 1、委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为..

QWD8596的博客 1031

C#之委托

C#中的委托是一个类型,它描述了一个方法的签名,即方法的参数类型和返回类型。委托可以看作是一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。 将一个或多个方法作为参数传递给另一个方法,从而在需要时调用这些方法。 实现事件处理程序。 实现回调方法。 实现异步编程等功能。 委托和类一样,是一种用户定义类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。可以通过一下操作步骤来使用委托。

互联网底层民工的博客 1万+

C# 委托详解

C#中委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

ellis1970的博客 1942

C#高级--委托详解

C#高级–委托详解 一、委托是什么 1、委托是什么 ​ 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。 2、委托声明 (1)委托可以声明在类外部,也可以在类内部 (2)跟方法有点类似,有参数,返回值,访问修饰符,比方法声明多一个关键字delegate namespace MyDelegate { /// <summary> /// 1.无参数无返回值委托 /// <

李宥的博客 1万+

C# 委托

在 C# 中,委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。委托提供了一种灵活的方式来实现事件处理、回调机制和异步编程等功能,极大地增强了 C# 语言的功能性和可扩展性。委托是一种引用类型,它定义了方法的签名。委托可以指向任何具有相同签名的方法。这个委托定义了一个方法签名,该方法接受一个整数参数和一个字符串参数,并且没有返回值。委托是 C# 中一个非常强大的特性,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。

2401_83367969的博客 2328

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2099

C#——委托

Action是.NET Framework内置的泛型委托,可以使用Action委托以参数形式传递方法,而不用显示声明自定义的委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。引用可在运行时被改变。定义了一个委托叫做 IntMethodInvoker ,这个委托可以指向带有一个int类型的参数,并且返回值是void的一个方法。在定义好委托后就可以实例化委托,命名方法委托在实例化委托时必须带入方法的具体名称或者是null。

m0_51743362的博客 1万+

MATLAB/Simulink与ThingSpeak集成:打通物联网数据与工业算法仿真的闭环

在工业算法开发与控制系统设计中,模型仿真与真实世界数据的脱节是常见的工程挑战。其核心原理在于构建一个双向数据流闭环,将虚拟的仿真模型与物理世界的传感器网络连接起来。这一技术方案的核心价值在于大幅缩短算法迭代周期,实现数据驱动的设计与验证。典型的应用场景包括数字孪生构建、预测性维护和硬件在环(HIL)测试的云端化。通过将MATLAB/Simulink这一强大的模型化设计环境,与ThingSpeak物联网云平台进行深度集成,工程师能够轻松地将实时或历史的物联网数据流直接注入仿真模型作为输入,同时将仿真结果实时回

weixin_34220179的博客 470

C#中委托

文章目录一、C#委托二、隐式类型与匿名类型三、C#扩展方法与yield关键字四、Lambda表达式 一、C#委托 举例1: 创建控制台应用程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TheOne { //声明委托 public delegate string Translatio

weixin_46596213的博客 4436

Fanuc机器人的坐标变换矩阵的研究2

一、Funuc用户坐标系的介绍 二、用户坐标系与世界坐标系的坐标转换 三、 以用户坐标系1为基础旋转变换后的用户坐标系 四、关于点的WPR的含义 4.1:点在用户坐标系和世界坐标系下的坐标关系 4.2 通过转换矩阵返回去推导WPR

qq_34047402的博客 1524

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 397

C#学习笔记8:接口、委托、事件

今日继续我的C#学习之路,今日学习接口、委托、事件 文章从实践出发学习这三个设计理念,并提供完整源码

NULL指向我的博客 1992

Linux USB Gadget框架解析:从设备模拟到驱动开发实战

USB(通用串行总线)是现代计算机系统中应用最广泛的外设连接标准,其主从动态切换的特性使其在嵌入式系统中扮演着双重角色。与I2C、SPI等固定主从架构不同,USB设备需要同时支持主机(Host)和从机(Device)两种模式,这催生了Linux内核中独特的USB Gadget框架。该框架通过分层设计,将硬件控制器驱动(UDC)、功能逻辑(Function)和配置管理(Configfs)解耦,实现了灵活的设备模拟能力。在工程实践中,开发者可以利用Gadget框架快速实现U盘、网络适配器、串口转换器等常见USB

weixin_28007513的博客 561

c#————委托

定义:委托是一种引用类型,存储了对方法的引用,即委托的内部包含一个指向某个方法的指针。委托可以看作是方法的抽象,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。声明:委托的声明类似于变量声明,需要指定委托类型和变量名。委托类型定义了方法的签名,包括返回类型和参数列表。例如,声明了一个名为MyDelegate的委托,它引用了一个返回void类型、带有一个string类型参数的方法。

2401_82978699的博客 1468

IMX6ULL---从零开始移植uboot-imx

IMX6ULL---从零开始移植uboot-imx

weixin_42162924的博客 1028

72、海洋地理信息系统:电子海图的全面解析

本文全面解析了海洋地理信息系统中的电子海图技术,从AIS数据的应用、电子海图数据的存储与显示,到电子导航的发展趋势和S-100通用水文数据模型的推广,系统地阐述了电子海图在现代航海中的核心作用及其未来发展方向。

hhh00的博客 252

C#委托 学习笔记

文章目录前言一、委托是什么?二、委托的使用1.回调静态方法2.回调实例方法3.委托链三、委托的实现原理四、语法糖 前言 方便以后的复习,在初步学习完C#委托后写的博客。 思维导图: 一、委托是什么? 委托是C#提供的回调函数机制,它是类型安全的。 回调机制类似于一种我们的生活场景: 某人拥有一张其他人的名片,当有需要的时候,可以打这张名片上的电话,名片的拥有者则会做出反应。 监听者模式也是由回调机制实现的 类似于c语言中的函数指针 可以当作参数传递于其他的方法中 二、委托的使用 下面的代码,演示了部

云观的博客 652

Python爬虫实战:Playwright 攻克京东图书新书榜(含动态价格与分页)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 593

C# 委托和事件(委托)

回调(callback)函数是Windows编程的一个重要部分。C或C++编程背景,在许多Windows API中使用过回调。VB添加AddressOf关键字后,开发人员就可以利用以前一度受到限制的API。回调函数实际上是方法调用的指针也称为函数指针。.NET以委托的形式实现函数指针的概念。C中函数指针只不过是一个指向存储单元的指针,无法说出这个指针实际指向什么,像参数和返回类型等更不知晓。

钢铁男儿 733

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C#入门学习笔记 #8(委托)

本文分享了C#委托的学习笔记,主要介绍了委托的基本概念和使用方法。委托是C#中函数指针的升级版,可以将方法作为参数传递。笔记详细讲解了Action和Func委托的使用,以及如何自定义委托类型。通过模板方法和回调方法的示例,展示了委托在实际编程中的应用场景。此外,还比较了单播委托和多播委托的区别,并通过学生做作业的案例演示了多播委托的用法。文章强调要合理使用委托,避免滥用带来的问题。这些笔记将持续更新,希望能帮助读者更好地理解和使用C#中的委托机制。

m0_73612206的博客 673

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# 委托-《C#语言入门详解》学习笔记

C# 委托-学习笔记跟着Timothy Liu老师学C# 系列一、委托的定义二、如何委托?三、委托的一般使用:四、委托的高级使用 跟着Timothy Liu老师学C# 系列 写在前面: 无意中找到了刘铁猛老师的C#视频,越听越带劲,手机都不想玩了,真的讲的融会贯通,非常带劲,让人把知识点串联的同时,还不得不感叹,真TM牛逼!老师本身是微软算法组高级工程师,所以实力不是一般的强。 能上youtube...

RandyOliver's House 663

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C#学习笔记】C#中委托

C#的委托是一种类型安全的函数指针,用于引用方法,委托允许方法作为参数传递,或者将方法赋值给委托变量,并通过委托调用方法。

Ho博客 637

【C#】委托是什么

在 C# 中,委托(Delegate)是一种类型安全的函数指针,可以将方法作为参数传递或者保存方法的引用。

qq_52208569的博客 1044
上一篇: c#软件开发学习笔记--索引器、接口、泛型
下一篇: c#软件开发学习笔记--事件、分层结构
Z599817841
博客等级 码龄4年 12粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值