当前位置: 首页 > news >正文

聊聊 C# 中的委托

聊聊 C# 中的委托

      • 什么是委托(Delegate)
      • 单播委托(Unicast Delegate)
      • 多播委托(Multicast Delegate)
      • 内置委托(Action & Func)
        • 单播委托(使用 Action 和 Func)
        • 多播委托(使用 Action)
        • 多播委托(使用 Func)
      • 使用内置 Action 和 Func 的好处
        • Action 委托
        • Func 委托
      • 什么情况下才需要自定义委托
        • 1. 方法签名不匹配
        • 2. 提高代码可读性和语义清晰性
        • 3. 多播委托的需求
        • 4. 事件处理
        • 5. 异步操作
        • 6. 泛型约束
      • 总结

什么是委托(Delegate)

委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递给其他方法,或者将方法赋值给变量。委托在 C# 中用于事件处理、回调函数、多播委托等场景。

  • 委托的声明

委托的声明类似于方法的声明,但不包含方法体。例如:

public delegate void MyDelegate(string message);

这个声明定义了一个名为 MyDelegate 的委托类型,它接受一个 string 类型的参数并且没有返回值。

  • 委托的实例化

你可以将一个方法赋值给委托实例,只要方法的签名与委托的签名匹配。例如:

public void PrintMessage(string message)
{Console.WriteLine(message);
}MyDelegate myDelegate = new MyDelegate(PrintMessage);
myDelegate("Hello, World!");

单播委托(Unicast Delegate)

单播委托是指只能引用一个方法的委托。这是 C# 中最常见的委托类型。

示例代码:

using System;// 1. 定义委托类型
public delegate void MyDelegate(string message);public class Program
{// 定义一个方法,它的签名与委托类型匹配public static void Method1(string message){Console.WriteLine("Method1: " + message);}public static void Main(){// 2. 创建委托实例并关联方法MyDelegate del1 = new MyDelegate(Method1);// 3. 调用委托del1("Hello, World!");}
}

输出结果:

Method1: Hello, World!

解释:

  • 在上面的示例中,我们首先定义了一个名为 MyDelegate 的委托类型,它接受一个 string 类型的参数,没有返回值。
  • 然后定义了一个方法 Method1,它的签名与 MyDelegate 匹配。
  • 创建了一个委托实例 del1,并将其关联到 Method1
  • 调用 del1 时,Method1 被执行。

多播委托(Multicast Delegate)

委托可以组合多个方法,形成一个多播委托。多播委托是指可以引用多个方法的委托。通过使用多播委托,可以将多个方法组合在一起,形成一个调用列表。

示例代码:

using System;// 1. 定义委托类型
public delegate void MyDelegate(string message);public class Program
{// 定义两个方法,它们的签名与委托类型匹配public static void Method1(string message){Console.WriteLine("Method1: " + message);}public static void Method2(string message){Console.WriteLine("Method2: " + message);}public static void Main(){// 2. 创建委托实例并关联方法MyDelegate del1 = new MyDelegate(Method1);MyDelegate del2 = new MyDelegate(Method2);// 3. 组合委托MyDelegate multicastDelegate = del1 + del2;// 4. 调用委托multicastDelegate("Hello, World!");// 5. 移除方法multicastDelegate -= del1;// 再次调用委托multicastDelegate("Hello again!");}
}

输出结果:

Method1: Hello, World!
Method2: Hello, World!
Method2: Hello again!

解释:

  • 在上面的示例中,我们首先定义了一个名为 MyDelegate 的委托类型,它接受一个 string 类型的参数,没有返回值。
  • 然后定义了两个方法 Method1Method2,它们的签名与 MyDelegate 匹配。
  • 创建了两个委托实例 del1del2,分别关联 Method1Method2
  • 使用 + 运算符将 del1del2 组合成一个多播委托 multicastDelegate
  • 调用 multicastDelegate 时,Method1Method2 会按顺序被调用。
  • 使用 - 运算符从 multicastDelegate 中移除 del1,再次调用时只有 Method2 被执行。

通过这种方式,多播委托为 C# 提供了一种强大的机制来处理 事件和回调,使得代码更加灵活和可扩展。

内置委托(Action & Func)

当然,我们可以使用 C# 内置的 ActionFunc 委托来实现 单播和多播委托 。下面我会分别给出示例代码。

单播委托(使用 Action 和 Func)

示例代码:

using System;public class Program
{// 定义一个方法,它的签名与 Action<string> 匹配public static void PrintMessage(string message){Console.WriteLine("Message: " + message);}// 定义一个方法,它的签名与 Func<int, int, int> 匹配public static int Add(int a, int b){return a + b;}public static void Main(){// 单播委托示例:使用 Action<string>Action<string> actionDelegate = new Action<string>(PrintMessage);actionDelegate("Hello, World!");// 单播委托示例:使用 Func<int, int, int>Func<int, int, int> funcDelegate = new Func<int, int, int>(Add);int result = funcDelegate(3, 4);Console.WriteLine("Result from funcDelegate: " + result);}
}

输出结果:

Message: Hello, World!
Result from funcDelegate: 7

解释:

  • 使用 Action<string> 委托来实现单播委托,关联 PrintMessage 方法。
  • 使用 Func<int, int, int> 委托来实现单播委托,关联 Add 方法。
  • 调用这些委托时,分别执行关联的方法。
多播委托(使用 Action)

Action 委托在 C# 中通常用于表示无返回值的方法。它是一组预定义的委托类型之一,旨在简化代码编写并提高可读性。

示例代码:

using System;public class Program
{// 定义两个方法,它们的签名与 Action<string> 匹配public static void PrintMessage1(string message){Console.WriteLine("Message1: " + message);}public static void PrintMessage2(string message){Console.WriteLine("Message2: " + message);}public static void Main(){// 创建 Action<string> 委托实例并关联方法Action<string> actionDelegate1 = new Action<string>(PrintMessage1);Action<string> actionDelegate2 = new Action<string>(PrintMessage2);// 组合委托Action<string> multicastDelegate = actionDelegate1 + actionDelegate2;// 调用委托multicastDelegate("Hello, World!");// 移除方法multicastDelegate -= actionDelegate1;// 再次调用委托multicastDelegate("Hello again!");}
}

输出结果:

Message1: Hello, World!
Message2: Hello, World!
Message2: Hello again!

解释:

  • 使用 Action<string> 委托来实现多播委托,关联 PrintMessage1PrintMessage2 方法。
  • 使用 + 运算符将 actionDelegate1actionDelegate2 组合成一个多播委托 multicastDelegate
  • 调用 multicastDelegate 时,PrintMessage1PrintMessage2 会按顺序被调用。
  • 使用 - 运算符从 multicastDelegate 中移除 actionDelegate1,再次调用时只有 PrintMessage2 被执行。
多播委托(使用 Func)

Func 委托通常用于返回值,因此多播委托的使用场景较少。不过,我们可以通过组合多个 Func 委托来实现类似的效果,但需要注意的是,Func 委托的返回值会覆盖之前的返回值。

示例代码:

using System;public class Program
{// 定义两个方法,它们的签名与 Func<int, int> 匹配public static int Increment(int value){return value + 1;}public static int Double(int value){return value * 2;}public static void Main(){// 创建 Func<int, int> 委托实例并关联方法Func<int, int> funcDelegate1 = new Func<int, int>(Increment);Func<int, int> funcDelegate2 = new Func<int, int>(Double);// 组合委托Func<int, int> multicastFunc = funcDelegate1 + funcDelegate2;// 调用委托// 注意:Func 的多播委托调用会覆盖之前的返回值int result = multicastFunc(3);Console.WriteLine("Result from multicastFunc: " + result);}
}

输出结果:

Unhandled Exception: System.MulticastNotSupportedException: Multicast delegate invocation with non-void return type is not allowed.

解释:

  • 使用 Func<int, int> 委托来尝试实现多播委托,关联 IncrementDouble 方法。
  • 尝试使用 + 运算符将 funcDelegate1funcDelegate2 组合成一个多播委托 multicastFunc
  • 调用 multicastFunc 时,会抛出 MulticastNotSupportedException 异常,因为 Func 委托的多播调用不支持非 void 返回类型。

使用内置 Action 和 Func 的好处

Action 委托

Action 委托是 C# 提供的内置委托类型,用于表示没有返回值的方法。Action 委托有多个重载版本,可以接受 016 个参数。

Func 委托

Func 委托是 C# 提供的内置委托类型,用于表示有返回值的方法。Func 委托有多个重载版本,可以接受 016 个参数,并且最后一个参数是返回值类型。

推荐使用他们的好处:

  • 简洁性:使用 Action & Func 可以避免显式声明委托类型,使代码更简洁。
  • 类型安全: Action & Func 是类型安全的函数指针,允许你将方法作为参数传递或赋值给变量,编译器会检查参数类型和数量。
  • 内置支持: Action & FuncC# 标准库的一部分,无需额外定义。

他们的区别:

  • Action:用于表示 没有返回值的方法,有多个重载版本,可以接受 016 个参数。
  • Func:用于表示 有返回值的方法,有多个重载版本,可以接受 016 个参数,并且最后一个参数是返回值类型

什么情况下才需要自定义委托

自定义委托在某些特定情况下是非常有用的,尤其是在现有的内置委托(如 ActionFunc)无法满足需求时。以下是需要自定义委托的一些常见场景:

1. 方法签名不匹配

当你的方法签名与现有的 ActionFunc 委托不匹配时,你需要定义一个自定义委托。例如,如果你有一个方法接受特定类型的参数并返回特定类型的值,而这些类型不是通用的或数量超过 Func 和 Action 支持的最大参数数量(16个),那么你需要自定义委托。

示例:

public delegate bool CustomDelegate(int x, string y, double z);
2. 提高代码可读性和语义清晰性

有时为了提高代码的可读性和语义清晰性,即使方法签名可以使用 ActionFunc,你仍然可以选择定义一个自定义委托。通过给委托一个有意义的名字,可以使代码更具描述性。

public delegate void EventHandler(object sender, EventArgs e);// 使用自定义委托使代码更易读
public event EventHandler OnDataReceived;
3. 多播委托的需求

当你需要将多个方法组合成一个多播委托,并且希望这些方法具有特定的签名时,自定义委托可以提供更好的控制和灵活性。

示例:

public delegate void NotificationHandler(string message);NotificationHandler handler = null;void RegisterNotifications()
{handler += HandleNotification1;handler += HandleNotification2;
}void HandleNotification1(string message)
{Console.WriteLine("Handler 1: " + message);
}void HandleNotification2(string message)
{Console.WriteLine("Handler 2: " + message);
}
4. 事件处理

C# 中,事件通常使用委托来定义。虽然你可以使用 EventHandlerEventHandler<TEventArgs>,但在某些情况下,你可能需要定义一个更具体的委托来处理特定类型的事件。

示例:

public class DataChangedEventArgs : EventArgs
{public int OldValue { get; }public int NewValue { get; }public DataChangedEventArgs(int oldValue, int newValue){OldValue = oldValue;NewValue = newValue;}
}public delegate void DataChangedEventHandler(object sender, DataChangedEventArgs e);public class DataSource
{public event DataChangedEventHandler DataChanged;protected virtual void OnDataChanged(DataChangedEventArgs e){DataChanged?.Invoke(this, e);}
}
5. 异步操作

对于复杂的异步操作,特别是那些涉及回调函数的情况,自定义委托可以帮助更好地组织和管理代码。

示例:

public delegate void AsyncOperationCompletedHandler(bool success, string result);public class AsyncService
{public void PerformAsyncOperation(AsyncOperationCompletedHandler callback){// 模拟异步操作Task.Run(() =>{// 操作完成后调用回调callback(true, "Operation completed successfully");});}
}
6. 泛型约束

有时你需要对委托中的泛型参数施加约束,这在 Func 和 Action 中是无法直接实现的。通过自定义委托,你可以添加泛型约束以确保类型安全。

示例:

public delegate TResult CustomGenericDelegate<in T, out TResult>(T arg) where T : class;

通过自定义委托,你可以更灵活地处理各种编程需求,同时保持代码的清晰性和可维护性。如果你发现现有的 ActionFunc 委托已经足够满足需求(通常大多数情况下内置委托类型已经足够需求),则无需额外定义自定义委托。

总结

  • ActionFuncC# 中非常方便的委托类型,可以简化委托的定义和使用。
  • Action 适用于没有返回值的方法。
  • Func 适用于有返回值的方法。
  • 多播委托通常使用 Action 来实现,而 Func 由于其返回值特性,多播调用不常用。

希望这些示例能帮助你更好地理解如何使用 ActionFunc 来实现单播和多播委托。

相关文章:

聊聊 C# 中的委托

聊聊 C# 中的委托 什么是委托&#xff08;Delegate&#xff09;单播委托&#xff08;Unicast Delegate&#xff09;多播委托&#xff08;Multicast Delegate&#xff09;内置委托&#xff08;Action & Func&#xff09;单播委托&#xff08;使用 Action 和 Func&#xff09…...

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …...

【循环神经网络】RNN介绍

在人工神经网络中&#xff0c;”浅层网络”是指具有一个输入层、一个输出层和最多一个没有循环连接的隐藏层的网络。随着层数的增加&#xff0c;网络的复杂性也在增加。更多的层或循环连接通常会增加网络的深度&#xff0c;并使其能够提供不同级别的数据表示和特征提取&#xf…...

centos,789使用mamba快速安装R及语言包devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…...

【C++】B2104 矩阵加法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出示例 &#x1f4af;我的解法解法分析解法优缺点 &#x1f4af;老师的解法解法分析优缺点对比 &#x1f4af;思路对比与优化对比总结改进与…...

深信服云桌面系统的终端安全准入设置

深信服的云桌面系统在默认状态下没有终端的安全准入设置&#xff0c;这也意味着同样的虚拟机&#xff0c;使用云桌面终端或者桌面套件都可以登录&#xff0c;但这也给系统带来了一些安全隐患&#xff0c;所以&#xff0c;一般情况下需要设置终端的安全准入策略&#xff0c;防止…...

Qt天气预报系统设计界面布局第四部分右边

Qt天气预报系统 1、第四部分右边的第一部分1.1添加控件 2、第四部分右边的第二部分2.1添加控件 3、第四部分右边的第三部分3.1添加控件3.2修改控件名字 1、第四部分右边的第一部分 1.1添加控件 拖入一个widget&#xff0c;改名为widget04r作为第四部分的右边 往widget04r再拖…...

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…...

Go语言的 的泛型(Generics)核心知识

Go语言的泛型&#xff08;Generics&#xff09;核心知识 在现代编程语言中&#xff0c;泛型是一种极为重要的特性&#xff0c;它允许开发者编写更加灵活、可重用和类型安全的代码。Go语言在推动城乡开发的过程中也逐渐加入了这一特性。自从Go 1.18版本发布以来&#xff0c;泛型…...

深入MySQL复杂查询优化技巧

在上一篇文章中,我们介绍了 MySQL 的关联关系理论与基础实践。本篇文章将进一步探讨 MySQL 复杂查询的优化技巧,帮助开发者应对大型数据集和高并发场景中的性能挑战。我们将涵盖索引设计、查询计划分析、分区技术以及事务管理的优化。 一、索引优化 索引是提高查询性能的核心…...

Redis(一)基本特点和常用全局命令

目录 一、Redis 的基本特点 1、速度快&#xff08;但空间有限&#xff09; 2、储存键值对的“非关系型数据库” 3、 功能丰富 4、 支持集群 5、支持持久化 6、主从复制架构 二、Redis 的典型应用场景 1、作为存储热点数据的缓存 2、作为消息队列服务器 3、作为把数据…...

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后&#xff0c;禁止该 IP 5 分钟内重新登录。以下是具体步骤&#xff1a; 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…...

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…...

WebRTC的线程切换

1. WebRTC的线程切换有哪些方法&#xff1a; Post方法PostTask方法Send方法Invoke方法 其中&#xff0c;Post和PostTask方法是【异步】的&#xff0c;即发送线程发送后无需等待接收线程完成处理&#xff1b; Send和Invode方法是【同步】的&#xff08;发送线程会一直等待接收…...

【three.js】搭建环境

一、安装Node.js和npm 下载与安装&#xff1a; 访问Node.js官方网站&#xff08;nodejs.org&#xff09;&#xff0c;根据你的操作系统下载并安装最新稳定版&#xff08;LTS版本&#xff09;的Node.js。安装过程中&#xff0c;npm&#xff08;Node包管理器&#xff09;会随No…...

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…...

信息科技伦理与道德1:绪论

1 问题描述 1.1 信息科技的进步给人类生活带来的是什么呢&#xff1f; 功能&#xff1f;智能&#xff1f;陪伴&#xff1f;乐趣&#xff1f;幸福&#xff1f; 基于GPT-3的对话Demo DeepFake 深伪技术&#xff1a;通过神经网络技术进行大样本学习&#xff0c;将个人的声音、面…...

HTTP2/3强势来袭

目录 摘要HTTP1/1.1概述HTTP/1.0 vs HTTP/1.1HTTP/1.0中的问题HTTP/1.1的管道化机制为什么HTTP/1.0导致“卡住”什么是队头阻塞 HTTP2兼容 HTTP/1.1头部压缩静态表编码动态表编码伪标头字段 二进制帧并发传输Stream ID的存储位置如何理解Steam&#xff0c;Message&#xff0c;F…...

2025考研江南大学复试科目控制综合(初试807自动控制原理)

​ 2025年全国硕士研究生招生考试江南大学考点 一年年的考研如期而至&#xff0c;我也变成了研二了&#xff0c;作为2次考研经历的学长&#xff0c;总是情不自禁地回想起自己的考研经历&#xff0c;我也会经常从那段经历中汲取力量。我能理解大多数考生考完后的的迷茫无助&…...

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…...

Web安全扫盲

1、建立网络思维模型的必要 1 . 我们只有知道了通信原理&#xff0c; 才能够清楚的知道数据的交换过程。 2 . 我们只有知道了网络架构&#xff0c; 才能够清楚的、准确的寻找漏洞。 2、局域网的简单通信 局域网的简单通信&#xff08;数据链路层&#xff09; 一般局域网都通…...

8. C++ 面向对象之特性一(封装)

面向对象主要包括三大类&#xff1a;封装&#xff0c;继承&#xff0c;多态 1.类和对象 c认为&#xff0c;万物皆为对象&#xff0c;对象上有其属性和行为 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...&#xff0c;行为有走、跑、跳、吃饭、唱歌... 车也可以作…...

软件工程期末复习(一)

题目复习 单选题 软件产品的核心特性是什么&#xff1f; A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案&#xff1a;B 单选题 在软件开发过程中&#xff0c;哪个环节最接近于传统制造业中的“生产”过程&#xff1f; A. 需求分析 B. 编码 C. 测试 D. 研制&#xff08…...

什么是Kafka的重平衡机制?

Kafka 的重平衛机制是指在消费者组中新增或删除消费者时&#xff0c;Kafka 集群会重新分配主题分区给各个消费者&#xff0c;以保证每个消费者消费的分区数量尽可能均衡。 重平衡机制的目的是实现消费者的负载均衡和高可用性&#xff0c;以确保每个消费者都能够按照预期的方式…...

基于Python读取ZIP和TAR格式压缩包教程

在数据处理和文件管理中&#xff0c;压缩包&#xff08;如ZIP、TAR等格式&#xff09;的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...

5G NTN(七) 高层(1)

说明&#xff1a;本专题主要基于3GPP协议38.821 目录 1. Idle态移动性增强 1.1 TA问题 1.1.1 TA的大小 1.1.2 针对NTN LEO的移动TA&#xff0c;场景C2和D2 1.1.3 针对NTN LEO的固定TA&#xff0c;场景C2和D2 1.1.3.1 方法1&#xff1a;当UE位置信息无法获取的时候 1.1.…...

git:指令集

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析&#xff0c;帮助更好地理解它们的作用及适用场景&#xff1a; 1. git switch 和 git restore 背景&#xff1a; 传统上&#xff0c;git checkout 是一个多功能命令&#xff0c;用于切换分支、检出文件、创建分支等&…...

【Vue学习】Vue 组件实例的生命周期(四个阶段,八个钩子)

一、为什么要理解生命周期&#xff1f; 理解生命周期就像是知道了一部电影的剧情走向&#xff0c;能让你在适当的时机做出反应。Vue 生命周期的钩子让你可以在不同的阶段插入你的逻辑&#xff0c;像是提前准备、后期清理或者在数据更新时做点事情。这种“精确控制”的能力会让你…...

第27周:文献阅读及机器学习

目录 摘要 Abstract 一、文献阅读 发现问题 研究方法 CNN-LSTM DT SVR 创新点 案例分析 数据准备 模型性能 预测模型的实现 仿真实验及分析 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周阅读文献《Short-term water qua…...

Tailwind CSS 实战:动画效果设计与实现

在现代网页设计中,动画效果就像是一位优秀的舞者,通过流畅的动作为用户带来愉悦的视觉体验。记得在一个产品展示网站项目中,我们通过添加精心设计的动画效果,让用户的平均停留时间提升了 35%。今天,我想和大家分享如何使用 Tailwind CSS 打造优雅的动画效果。 设计理念 设计动…...

在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?

在Kubernetes中&#xff0c;当Pod请求另一个Pod时偶尔出现超时或延迟&#xff0c;可能是由于多种原因造成的。以下是一些建立的排查步骤&#xff1a; 1. 检查网络配置和插件&#xff1a; 确认你的kubernetes集群使用了合适的网络插件&#xff08;如Calico、Flannel等&#xf…...

C# 设计模式(结构型模式):外观模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;外观模式 (Facade Pattern) 在复杂系统中&#xff0c;往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下&#xff0c;我们可以使用外观模式&#xff08;Facade…...

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…...

MCGS学习记录

软件包 用户窗口 主窗口 元件&#xff1a;工具箱->输入框上面 数据对象 在工作台的实时数据库可以新增数据对象 理解为中间变量&#xff0c;控件改变其值&#xff0c;控件监测其值做出变化 基本属性 设定变量名和初始值 指针化&#xff1f; 变化时自动保存初始值&#x…...

Swift Protocols(协议)、Extensions(扩展)、Error Handling(错误处理)、Generics(泛型)

最近在学习 Swift&#xff0c;总结相关知识 1. Protocols&#xff08;协议&#xff09; 1.1 协议的定义和实现 协议&#xff08;protocol&#xff09; 是一种定义方法和属性的蓝图&#xff0c;任何类、结构体或枚举都可以遵循协议。遵循协议后&#xff0c;需要实现协议中定义…...

axios和fetch的实现原理以及区别,与XMLHttpRequest的关系,并结合react封装统一请求示例

Axios 和 Fetch 对比及统一请求封装 1. Axios 基础用法 1.1 安装和引入 // 安装 npm install axios// 引入 import axios from axios;1.2 基本请求方法 // GET 请求 axios.get(/api/users).then(response > console.log(response.data)).catch(error > console.error…...

2024年阅读书单

《高效能人士的7个习惯》 史蒂芬.柯维 精进 《高效能人士的7个习惯》在读了一遍之后&#xff0c;记住非常深刻的就是积极主动和以终为始。 《软件架构》 Simon Brown 架构、技术 《软件架构》这本书比较抽象&#xff0c;若是工作时间比较少的人来读&#xff0c;可能觉得作者没写…...

Eclipse 内容辅助

Eclipse的内容辅助&#xff08;Content Assist&#xff09;功能是一项核心特性&#xff0c;它通过提供代码提示和自动完成建议来提高开发效率。这个功能能够在用户编写代码时自动显示可能的代码补全选项&#xff0c;如变量名、方法名、类名和关键字等。它还能根据用户的输入和上…...

【数学建模笔记】评价模型-基于熵权法的TOPSIS模型

视频课地址&#xff1a;https://www.bilibili.com/video/BV1eRyVYUEhg 本系列文章和课程一样&#xff0c;只使用Python实现&#xff0c;好久没玩数学建模了 国赛中不能再用TOPSIS&#xff0c;可以做辅助算法。 1. 算法原理 熵权TOPSIS方法是一种结合熵权法和TOPSIS的决策分析…...

小程序发版后,强制更新为最新版本

为什么要强制更新为最新版本&#xff1f; 在小程序的开发和运营过程中&#xff0c;强制用户更新到最新版本是一项重要的策略&#xff0c;能够有效提升用户体验并保障系统的稳定性与安全性。以下是一些主要原因&#xff1a; 1. 功能兼容 新功能或服务通常需要最新版本的支持&…...

数据分析思维(七):分析方法——群组分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…...

SAP 01-初识AMDP(ABAP-Managed Database Procedure)

1. 什么是AMDP(ABAP-Managed Database Procedure) 1.&#xff09;AMDP - ABAP管理数据库程序&#xff0c;是一种程序&#xff0c;我们可以使用SQLSCRIPT在AMDP内部编写代码&#xff0c;SQLSCRIPT是一种与SQL脚本相同的数据库语言&#xff0c;这种语言易于理解和编码。 将AM…...

.net core 线程锁,互斥锁,自旋锁,混合锁

线程锁、互斥锁、自旋锁和混合锁是多线程编程中的重要概念&#xff0c;它们用于控制对共享资源的访问&#xff0c;避免数据竞争和不一致性。每种锁有其特定的适用场景和特点。我们来逐一解释它们&#xff0c;并进行比较。 1. 线程锁&#xff08;Thread Lock&#xff09; 线程…...

大数据系列之:深入理解学习使用腾讯COS和COS Ranger权限体系解决方案,从hdfs同步数据到cos

大数据系列之&#xff1a;深入理解学习使用腾讯COS和COS Ranger权限体系解决方案&#xff0c;从hdfs同步数据到cos 对象存储COS对象存储基本概念COS Ranger权限体系解决方案部署组件COS Ranger Plugin部署COS-Ranger-Service部署COS Ranger Client部署 COSN 从hdfs同步数据到co…...

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin&#xff0c;未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案&#xff0c;云打包 需要排队且还有次数限制&#xff0c;本地打包 则就没有这些限制&#xff0c;而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…...

单片机常用外设开发流程(1)(IMX6ULL为例)

1.通过GPIO引脚控制led灯和key按钮 &#xff08;1&#xff09;设置多路复用的引脚&#xff08;SW_MUX_CTL&#xff09;也可以说是选择让引脚以哪种工作模式工作 &#xff08;2&#xff09;设置电器属性&#xff08;SW_PAD_CTL&#xff09;上拉、等等... (3)设置GPIO的方向&am…...

机器学习 学习知识点

机器学习 学习知识点 什么是消融实验&#xff08;Ablation experiment&#xff09;&#xff1f;num_step与batch_size的区别python glob.glob()函数认识python的条件判断之is not、is not None、is Nonetqdm介绍及常用方法softmax 激活函数。type_as(tesnor)Python OpenCV cv2.…...

深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)

1. 什么是PINN&#xff08;物理信息神经网络&#xff09;&#xff1f; 物理信息神经网络&#xff08;PINN&#xff0c;Physics-Informed Neural Networks&#xff09;是一类通过结合神经网络和物理方程的深度学习方法。其主要特点是将物理系统的约束条件&#xff08;如偏微分方…...

人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例

泰坦尼克生存预估案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report import matplotlib.pyplot as plt from sklearn.tree import plot_t…...