一起谈.NET技术,.NET简谈委托链

简介:   说起链表大家都很熟悉,说起委托相信大部分的.NET程序员都也很了解。在平时的开发过程中经常会用到这两种技术,只不过链表在.NET里面已经被封装了,让我们用起来更加的方便就是集合类型Collection。

  说起链表大家都很熟悉,说起委托相信大部分的.NET程序员都也很了解。在平时的开发过程中经常会用到这两种技术,只不过链表在.NET里面已经被封装了,让我们用起来更加的方便就是集合类型Collection。在某些时候我们有必要要了解这些方便而又快捷的背后是怎样封装的,委托是一种特殊的类型,在.NET里面是用来作为方法的一种封装。在一些非托管的代码中如C++就没有这么幸运了,我们要面对是一些复杂的地址变换、链表的指针维护、内存的取址等等。微软一向都是人性化模仿的对象,不管是他的操作系统还是开发平台IDE做的都很舒服。可能有的人会说把程序员这么崇高而又神秘的职业该大众化了,是人都会写程序。这种问题大家仁者见仁,智者见智了。

  今天我要说的就是.NET中的委托链,也许这个技术名词见的人很少,但是概念大家都能从字面上理解出来,那就是委托与链表的关系。简单点就是委托通过链表的方式将其保存,然后依次调用,关于委托与事件的可以参照本人的“委托与事件”文章。委托是指向方法的指针,将方法以对象的方式包装起来,方便、安全、异步的调用,在异步方面都是CLR通过后台线程去处理,我们不需要关心一些线程调度互斥等问题,特殊情况下也需要我们自己去从头封装。委托是一种类型,通过实例化多个委托实例去封装要调用的方法,在程序运行过程中每一个方法是被压入栈的数据结构中的,在调用之前先要确定方法的地址,所有通过引用类型将方法独立出来,方便寻找和调用。当多个委托实例聚集在一起的时候就形成了委托链这么一个数据结构,比如在我们经常使用的Button中一个Click事件,我们会通过:Button.Click+=New 委托类型(方法1)将一个委托实例加入到委托链表中去,我继续添加一个方法到链表中去Button.Click+=New 委托类型(方法2),这个时候在委托链表中就有了两个委托实例了,也就是两个方法的调用。链表是有顺序的,方法2在方法1后面,代码的调用顺序就是先调用方法1,然后将处理结果再带入到方法2中,处理依次进行,这样就形成了对委托链的整体调用。在使用时有一些细节需要注意也是性能的问题,“代码永远是危害程序性能的罪魁祸首”,在上述代码中Btton.Click+=New 委托类型(方法1),可以写成Button.Click+=方法1,这样就减少了一个委托实例的内存分配,系统将使用顺序表保存调用的方法,而不是链表,链表和顺序表在性能的区别我想学过《数据结构》的人都知道。当不需要使用链表中的某个方法时,可以通过委托移除表达式将方法从委托链表中移除,Button.Click-=方法1,我已经将方法1从委托链表中移除,当下次调用时,代码是不会走到方法1中的,在我们开发过程中经常会遇到这样的情况:一个事件发生了我要调用N个方法,但是我并不能控制这种执行顺序,这个时候我们就可以将方法从链表中移除或者添加,很方便的控制委托链中的方法执行前后顺序。也会遇到这种情况,我有十个方法用来处理程序的逻辑,但是这十个方法不是死的,我需要根据不同的条件,从这十个方法中动态跳转到其他的逻辑处理中,然后再回到该方法,程序永远不会脱离这十个方法,这个时候我们就需要用到委托参数了,这个时候我们需要定义一种类型用来在委托链表中传递,方法通过判断这个类型的实例的状态,确定是否继续向下传递;

图1:

 这个委托链中有4个方法,当我执行到方法2的时候我需要判断用户的输入是否正确,是否让后面的方法在继续执行:

 

 
 
public class Class1
{
/// <summary>
/// 委托类型
/// </summary>
/// <param name="ismove"> 是否向下执行的标识 </param>
public delegate void Print( ref string ismove);
/// <summary>
/// 委托实例
/// </summary>
Print p;
/// <summary>
/// 默认构造函数
/// </summary>
public Class1()
{
// 添加四个方法
Print p = new Print(method1); // 第一个方法用来实例化委托第一个实例
p += method2;
p
+= method3;
p
+= method4;
}
/// <summary>
/// 开始执行委托链
/// </summary>
/// <returns></returns>
public string run()
{
string ismove = " yes " ;
p(
ref ismove);
return ismove;
}
public void method1( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
public void method2( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
// 我这里执行出了问题,不想继续向下执行了
ismove = " no " ; // 后面的所有方法都不会执行
}
}
public void method3( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
public void method4( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
}

我们无法确定要移除哪一个方法,所以我们要确定每一次的方法调用都是正确的,方法的调用的会正常进行但是我们加入了判断这样就能控制执行的状态;

图2:

在图2中我将方法3和方法4从委托链中移除了,后面的调用将不会调用到他们。

 
 
public class Class1
{
/// <summary>
/// 委托类型
/// </summary>
/// <param name="ismove"> 是否向下执行的标识 </param>
public delegate void Print( ref string ismove);
/// <summary>
/// 委托实例
/// </summary>
Print p;
/// <summary>
/// 默认构造函数
/// </summary>
public Class1()
{
// 添加四个方法
Print p = new Print(method1); // 第一个方法用来实例化委托第一个实例
p += method2;
p
+= method3;
p
+= method4;
}
/// <summary>
/// 开始执行委托链
/// </summary>
/// <returns></returns>
public string run()
{
string ismove = " yes " ;
p(
ref ismove);
return ismove;
}
public void method1( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
public void method2( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
// 这里已经处理完所有的逻辑,不需要在调用后面的调用
p -= method3; // 移除方法3
p -= method4; // 移除方法4
}
}
/* **********************后面的方法都不会被调用***************************************** */
public void method3( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
public void method4( ref string ismove)
{
if (ismove == " yes " ) // 判断是否要继续向下执行
{
}
}
}
目录
相关文章
|
27天前
|
人工智能 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
|
27天前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
27天前
|
数据可视化 NoSQL C#
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
|
27天前
|
设计模式 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
|
2月前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
55 1
|
2月前
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
137 12
|
2月前
|
人工智能 前端开发 Devops
.NET技术自发布以来,在软件开发领域发挥了重要作用
【9月更文挑战第12天】.NET技术自发布以来,在软件开发领域发挥了重要作用。本文分为三部分探讨其在现代开发中的应用:首先介绍.NET的核心价值,包括语言多样性、强大的开发工具支持、丰富的类库、跨平台能力和活跃的社区;接着分析其在企业级应用、Web开发、移动应用、云服务及游戏开发中的实际应用;最后讨论.NET面临的挑战与未来趋势,如性能优化、容器化、AI集成及跨平台框架竞争等。通过不断的技术创新和社区驱动,.NET将持续推动软件开发的进步。
38 4
|
2月前
|
人工智能 开发框架 算法
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
|
2月前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
|
2月前
|
人工智能 算法 C#
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
下一篇
无影云桌面