C#委托相关知识

最开始学习C#的时候,简单的看过委托,最近工作中经常需要使用到委托。这篇笔记是对之前看过的委托的一个补充,也是对最近工作中遇到的委托的一个总结吧。

这里使用的是窗体程序作为例子。实例在文末,可下载。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

有四种表现形态:delegate、Action、Func、predicate

委托定义要和作为其参数的方法形式一样,也就是说,参数、返回值及其他都是相同

先放一张最后实例的样图:

2323.png

(1):delegate委托。

delegate我们常用到的一种声明

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。

委托实例化格式如下:

委托类名 委托实例名 = new 委托类名(Target) ;

MethodtDelegate fele = new MethodtDelegate(fun);

其中,委托实例名是自定义的名称,fun是要传入的方法的名称。注意fun是方法的引用,不能带()。带()的话是该方法的调用。区分引用和调用。

委托的实例化还有一种简单的方法:

委托类名 委托实例名 = Target;

MethodtDelegate dele = fun;

在需要委托实例的地方直接传入fun引用即可,C#编译器会自动根据委托类型进行验证,这称为“委托推断”。

实例:

// =========  delegate  ================/// <summary>/// 定义一个没有返回值的delegate委托(有参数)/// </summary>public delegate void MethodDelegate(Color color);/// <summary>/// 颜色下拉列表改变事件/// </summary>private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){Color color = Color.White;int index = comboBox1.SelectedIndex;switch (index){case 0:color = Color.Red;break;case 1:color = Color.Blue;break;case 2:color = Color.Black;break;case 3:color = Color.GreenYellow;break;}// 实例化委托MethodDelegate delegates = new MethodDelegate(form2.SetColor);// 委托推断(简写的委托)Form2颜色变MethodDelegate delegateOnly = form2.SetColor;// 多播委托(一个委托,执行多个事件) FOrm2 和 Form3颜色都变delegateOnly += form3.SetColor;// 执行delegateOnly(color);// 清空委托ClearDelegate(delegateOnly);}

 Form2

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

Form3

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

(2):Action委托

Action是无返回值的泛型委托。

Action 表示无参,无返回值的委托

Action<int,string> 表示有传入参数int,string无返回值的委托

Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

Action至少0个参数,至多16个参数,无返回值。

<>中表示参数类型。

实例:

// =========  action  ================public Action<Color> UpdateColor;private void comboBox2_SelectedIndexChanged(object sender, EventArgs e){Color color = Color.White;int index = comboBox2.SelectedIndex;switch (index){case 0:color = Color.Red;break;case 1:color = Color.Blue;break;case 2:color = Color.Black;break;case 3:color = Color.GreenYellow;break;}UpdateColor = form2.SetColor;UpdateColor += form3.SetColor;UpdateColor(color);}

  Form2

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

Form3

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

 (3):Func

Func是有返回值的泛型委托

Func<int> 表示无参,返回值为int的委托

Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

// =========  Func  ================/// <summary>/// func 委托,最后一个参数是返回值类型,之前的都是参数类型/// </summary>public Func<Color,string> func;private void comboBox3_SelectedIndexChanged(object sender, EventArgs e){Color color = Color.White;int index = comboBox3.SelectedIndex;switch (index){case 0:color = Color.Red;break;case 1:color = Color.Blue;break;case 2:color = Color.Black;break;case 3:color = Color.GreenYellow;break;}func = form2.SetColorFunc;func += form3.SetColorFunc;string res = func(color);label4.Text = res;}

Form2

public string SetColorFunc(Color color){pictureBox1.BackColor = color;pictureBox1.Refresh();return "Form2 换色成功";}

Form3

      
  public string SetColorFunc(Color color){pictureBox1.BackColor = color;pictureBox1.Refresh();return "Form3 换色成功";}

(4):predicate

泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array  List 类的几种方法使用,用于在集合中搜索元素。

这个用的相对较少,可以被Func委托代替。

static void Main(string[] args){Point[] points = { new Point(100, 200),new Point(150, 250), new Point(250, 375),new Point(275, 395), new Point(295, 450) };Point first = Array.Find(points, ProductGT10);Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);Console.ReadKey();}private static bool ProductGT10(Point p){if (p.X * p.Y > 100000){return true;}else{return false;}}

(5):委托清空

清空委托方法:

/// <summary>/// 清空委托方法一/// </summary>public void ClearDelegate(MethodDelegate delegateOnly){while (delegateOnly != null){delegateOnly -= delegateOnly;}}

(6):匿名委托:

采用匿名方法实例化的委托称为匿名委托。

每次实例化一个委托时,都需要事先定义一个委托所要调用的方法。为了简化这个流程,C# 2.0开始提供匿名方法来实例化委托。这样,我们在实例化委托时就可以 “随用随写” 它的实例方法。

使用的格式是:

委托类名 委托实例名 = delegate (args) {方法体代码} ;()args表示参数

这样就可以直接把方法写在实例化代码中,不必在另一个地方定义方法。当然,匿名委托不适合需要采用多个方法的委托的定义。

// =========  匿名委托  ================private void comboBox4_SelectedIndexChanged(object sender, EventArgs e){Color color = Color.White;int index = comboBox4.SelectedIndex;switch (index){case 0:color = Color.Red;break;case 1:color = Color.Blue;break;case 2:color = Color.Black;break;case 3:color = Color.GreenYellow;break;}// 这段委托执行的时候,出现了一个问题,就是委托不好用// 下边那行委托赋值,是不行的。因为,匿名委托也是相当于创建了一个委托。没创建完呢,就给自己赋值,是不行的。// 因此我们创建了一个委托之后,在下边用另一个委托给其赋值。是好用的MethodDelegate delegates = delegate(Color col){Console.WriteLine("123");delegates = form2.SetColor;};// 匿名委托(先得有委托,才能匿名)MethodDelegate delegates2 = delegate (Color col){delegates = form2.SetColor;delegates += form3.SetColor;};delegates2(color);delegates(color);}

 Form2

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

Form3

public void SetColor(Color color)
{pictureBox1.BackColor = color;pictureBox1.Refresh();
}

委托总结:

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

Func可以接受0个至16个传入参数,必须具有返回值

Action可以接受0个至16个传入参数,无返回值

Predicate只能接受一个传入参数,返回值为bool类型

匿名委托就那么回事,能用就用,不能用就用基本的就行。

这是C#委托的最基础的一些知识,以后遇到了再补充。

有好的建议,请在下方输入你的评论。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29860.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效出报表的工具有哪些?奥威BI报表工具怎样?

随着企业精细化数据分析的展开&#xff0c;数据分析报表的制作压力也随之增加。对企业而言&#xff0c;拥有一个高效出报表的工具十分重要。高效出报表的工具有哪些&#xff1f;奥威BI报表工具的效率够不够高&#xff1f; 高效出报表的工具有很多&#xff0c;奥威BI报表工具就…

VSCode 注释后光标快速定位下一行

VSCode默认用 Ctrl / 注释一行时&#xff0c;光标停留在该行中。下面介绍如何注释后&#xff0c;光标会自动移动到下一行。 1.【View】 ->【Extensions】->【查找并安装Multi-command 扩展】 2.【File 】 -> 【Preferences 】->【Keyboard Shortcuts】&#xff08…

零基础学习,轻松打造物业服务小程序

现如今&#xff0c;物业服务已经成为了人们生活中不可或缺的一部分。为了更好地满足人们对物业服务的需求&#xff0c;许多企业和个人开始开发物业服务小程序&#xff0c;以便提供更加便捷和高效的服务。然而&#xff0c;对于大多数人来说&#xff0c;搭建一个小程序可能需要一…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞&#xff0c;导致在每次上线发布的时间长、出问题&#xff0c;对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用&#xff1a; 多功能并行开发时&#xff0c;测试人员可以根据需求任务分配测试自己的功能&#…

【Java基础教程】(十三)面向对象篇 · 第七讲:继承性详解——继承概念及其限制,方法覆写和属性覆盖,关键字super的魔力~

Java基础教程之面向对象 第七讲 本节学习目标1️⃣ 继承性1.1 继承的限制 2️⃣ 覆写2.1 方法的覆写2.2 属性的覆盖2.3 关键字 this与 super的区别 3️⃣ 继承案例3.1 开发数组的父类3.2 开发排序类3.3 开发反转类 &#x1f33e; 总结 本节学习目标 掌握继承性的主要作用、实…

人工智能自然语言处理:N-gram和TF-IDF模型详解

人工智能自然语言处理&#xff1a;N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作&#xff0c;形成了长度是 N 的字节片段序列。 每一个字节片段称为 gram&#xff0c;对所…

Spring底层

配置文件 配置优先级 之前讲解过&#xff0c;可以用这三种方式进行配置 那如果这三种都进行了配置&#xff0c;那到底哪一份生效呢&#xff1f; 结论 优先级从大到小 properties>yml>yaml然后就是现在一般都用yml文件进行配置 其他配置方式 除了配置文件外 还有不同…

【java】对ArrayList中的元素进行排序的几种方式

对ArrayList中的元素进行排序的几种方式 一、使用Collections工具类 1、对基本类型排序 通过Collections.sort()对基本类型排序默认是以升序排序 // 1.Collections.sort()默认按照升序排序 List<Integer> integerList new ArrayList<>(); Collections.addAll(…

N天爆肝数据库——MySQL(5)

本文主要对索引进行了讲解 这里写目录标题 本文主要对索引进行了讲解索引概述介绍优缺点索引结构二叉树红黑树B-Tree(多路平衡查找树)BTreeBTree与B-Tree区别: HashHash索引特点 为什么InnoDB存储引擎选择使用BTree索引结构&#xff1f;索引分类在InnoDB存储引擎中&#xff0c;…

KUKA机械臂的导纳控制

KUKA机械臂的导纳控制 在近期的实验中&#xff0c;需要根据传感器的给出的实时位置信息进行导纳控制&#xff0c;并实时改变导纳控制的参数。由于KUKA自带的实时导纳控制模型无法实时修改参数&#xff0c;因此尝试了自己实现导纳控制。网上这方面的资料比较少&#xff0c;整理…

Notepad++ 配置python虚拟环境(Anaconda)

Notepad配置python运行环境步骤&#xff1a; 打开Notepad ->”运行”菜单->”运行”按钮在弹出的窗口内输入以下命令&#xff1a; 我的conda中存在虚拟环境 (1) base (2) pytorch_gpu 添加base环境至Notepad中 cmd /k chdir /d $(CURRENT_DIRECTORY) & call cond…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…