快速业务通道

实例解析C++/CLI之代理与事件

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
10);
  Actions::F1: 10
  /*2*/ D^ cd2 = gcnew D(&Actions::F2); //包含F2的调用列表
  cd2(15);
  Actions::F2: 15
  /*3*/ D^ cd3 = cd1 + cd2; //包含F1 + F2的调用列表
  cd3(20);
  Actions::F1: 20
  Actions::F2: 20
  /*4*/ cd3 += cd1; //包含F1 + F2 + F1的调用列表
  cd3(25);
  Actions::F1: 25
  Actions::F2: 25
  Actions::F1: 25
  Actions^ t = gcnew Actions();
  D^ cd4 = gcnew D(t, &Actions::F3);
  /*5*/ cd3 += cd4; //包含F1 + F2 + F1 + t->F3的调用列表
  cd3(30);
  Actions::F1: 30
  Actions::F2: 30
  Actions::F1: 30
  instance of Actions::F3: 30
  /*6*/ cd3 -= cd1; //移除最右边的F1
  cd3(35); //调用F1、F2,t->F3
  Actions::F1: 35
  Actions::F2: 35
  instance of Actions::F3: 35
  /*7*/ cd3 -= cd4; //移除t->F3
  cd3(40); //调用F1、F2
  /*8*/ cd3 -= cd1; //移除F1
  cd3(45); //调用F2
  /*9*/ cd3 -= cd2; //移除F2,调用列表现在为空
  /*10*/Console::WriteLine("cd3 = {0}",
  (cd3 == nullptr ? "null" : "not null"));
}
Actions::F1: 40
Actions::F2: 40
Actions::F2: 45
cd3 = null

代理可通过 + 和 += 操作符来合并,如标号3、4中所示。两个单入口列表会连接成一个新的双入口列表,以先左操作数,后右操作数的顺序。新的列表被cd3引用,而现有的两个列表并未改变。在此要注意的是,不能合并不同类型的代理。

正如在标号4中所见,同一个函数可在一个调用列表中包装多次;而在标号5中,也说明了一个调用列表能同时包含类与实例函数。代理可通过 - 或 -= 操作符移除,如标号6中所示。

当同一个函数在调用列表中出现多次时,一个对它的移除请求会导致最右边的项被移除。在标号6中,这产生了一个新的三入口列表,其被cd3引用,且前一个列表保持不变(因为先前被cd3引用的列表现在引用计数为零,所以会被垃圾回收)。

当一个调用列表中的最后一项被移除时,代理将为nullptr值,此处没有空调用列表的概念,因为,根本就没有列表了。

例5中演示了另一个代理合并与移除的例子,正如标号3a与3b中所示,两个多入口调用列表是以先左操作数,后右操作数的顺序连接的。

如果想移除一个多入口列表,只有当此列表为整个列表中严格连续的子集时,操作才会成功。例如,在标号4b中,你可以移除F1和F2,因为它们是相邻的,对标号5b中的两个F2及标号6b中的F1、F2来说,道理也是一样的。但是,在标号7b中,列表中有两个连续的F1,所以操作失败,而结果列表则是最开始的列表,它包含有4个入口。

例5:

using namespace System;
delegate void D(int x);
void F1(int i) { Console::WriteLine("F1: {0}", i); }
void F2(int i) { Console::WriteLine("F2: {0}", i); }
int main()
{
  D^ cd1 = gcnew D(&F1);
  D^ cd2 = gcnew D(&F2);
  /*1*/ D^ list1 = cd1 + cd2; // F1 + F2
  /*2*/ D^ list2 = cd2 + cd1; // F2 + F1
  D^ cd3 = nullptr;
  /*3a*/ cd3 = list2 + list1; // F2 + F1 + F1 + F2
  cd3(10);
  /*3b*/ cd3 = list1 + list2; // F1 + F2 + F2 + F1
  cd3(20);
  /*4a*/ cd3 = list1 + list2; // F1 + F2 + F2 + F1
  /*4b*/ cd3 -= cd1 + cd2; // F2 + F1
  cd3(30);
  /*5a*/ cd3 = list1 + list2; // F1 + F2 + F2 + F1
  /*5b*/ cd3 -= cd2 + cd2; // F1 + F1
  cd3(40);
  /*6a*/ cd3 = list1 + list2; // F1 + F2 + F2 + F1
  /*6b*/ cd3 -= cd2 + cd1; // F1 + F2
  cd3(50);
  /*7a*/ cd3 = list1 + list2; // F1 + F2 +

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号