• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

详解c# 委托链

c# 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

引言:

上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一个方法,那委托能不能封装多个方法呢?因为生活中经常会听到,我代表大家的意见等这样的说话,既然委托也是一个代表,那他如果只能代表一个人,那他的魅力就不是很大了吧,所以我们就会委托能不能代表多个方法的? 答案是可以的,这就是本专题要讲的内容——委托链,委托链也是一个委托,只是因为它是把多个委托链在一起,所以我们就以委托链来这么称呼它的。

一、到底什么是委托链

我们平常实例化委托对象时都是绑定一个方法的, 前一个专题介绍的委托也是包装了一个方法的, 用前面的例子就是委派律师的只有一个人,也就是当事人只有一个的,但是现实生活中显然不是这样的,在官司的时候律师可以同时接多个案子,也是接收多个当时人的委派,这样,该律师就与多个当事人绑定在一起了, 需要了解多个当事人的案件情况的。其实这就是生活中的委托链,此时这位律师不仅仅是一个人的代表律师了,而是多个当事人的律师。生活中的委托链和C#中的委托链很类似的,现在就说说C#中的委托链到底是个什么的?

本文来源gao!daima.com搞$代!码网

首先委托链就是一个委托,所以大家不要看到委托链感觉又是什么C#中的新特性的,然而要把多个委托链在一起,就必须存储多个委托的引用,那委托链对象是在哪里存储多个委托的引用的呢?还记得我们上一专题中,我们介绍的委托类型有三个非公共字段的吗?这三个字段是——_target,methodPtr 和_invocationList,至于这三个字段具体代表什么大家可以查看我的上一专题的文章,然而_invocationList 字段正是存储多个委托引用的地方的。

为了更好的解释_invocationList是如何来存储委托引用的,下面先看一个委托链的例子和运行结果,然后再分析原因:

using System;

namespace DelegateTest

{
 public class Program
 {
  // 声明一个委托类型,它的实例引用一个方法
  // 该方法回去一个int 参数,返回void类型
  public delegate void DelegateTest(int parm);

  public static void Main(string[] args)
  {
   // 用静态方法来实例化委托
   DelegateTest dtstatic = new DelegateTest(Program.method1);

   // 用实例方法来实例化委托
   DelegateTest dtinstance = new DelegateTest(new Program().method2);
   
   // 隐式调用委托
   dtstatic(1);

   // 显式调用Invoke方法来调用委托
   dtinstance.Invoke(1);

   // 隐式调用委托
   dtstatic(2);

   // 显式调用Invoke方法来调用委托
   dtinstance.Invoke(2);
   Console.Read();
  }
  private static void method1(int parm)
  {
   Console.WriteLine("调用的是静态方法,参数值为:" + parm);
  }

  private void method2(int parm)
  {
   Console.WriteLine("调用的是实例方法,参数值为:" + parm);
  }
 }

}

运行结果:

下面就来分析下为什么会出现这样的结果的:

一开始我们实例化了两个委托变量,如下代码:

 // 用静态方法来实例化委托
   DelegateTest dtstatic = new DelegateTest(Program.method1);

   // 用实例方法来实例化委托
   DelegateTest dtinstance = new DelegateTest(new Program().method2);

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:详解c# 委托链

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址