c#2.0匿名方法五(转)

在循环控制结构内使用匿名方法的局部变量的用法

  当处理循环控制结构时将局部变量封装入类的数据成员有着有趣但危险的一面,让我们看看下面代码:

public class Program
{
 public delegate void MyDelegate();
 public static void Main(string[] args)
 {
  MyDelegate d = null;
  for (int i = 1; i <= 5; i++)
  {
   MyDelegate tempD = delegate
   {
    Console.WriteLine(i);
   };
   d += tempD;
  }
  d();
 }
}

  上面的代码运行时将会有什么输出呢?我们的意图是捕获在我们的匿名方法中的循环计数变量''i''并显示之。我们预期的输出应该如下所示:

  1
  2
  3
  4
  5

  但是如果你运行上面的代码,输出将是如下所示:
 
  6
  6
  6
  6
  6

  如果我们仔细回忆我们关于匿名方法的内部工作机制的知识,我提到:在匿名方法中被捕获的任何局部变量将会被该作用域的一个新的已创建内部类的实例数据成员替代。对于循环控制变量,作用域是包含了for循环的作用域,这就是上面的简单代码所示的main方法体。因此当该代码编译时,C#编译器生成创建了内部类的实例的代码,包装了匿名方法和循环计数变量,在for循环的外部。并且该内部类的实例的数据成员,代表了循环计数变量,将被用来替代用于for循环而且也在匿名方法中使用的原始循环计数变量。因此来自内部类的相同实例的数据成员被用于for循环并且也用在包装匿名方法的实例方法中。作为循环完成时的结果,实例数据成员会增加六次。这里有一个需要注意的重要地方:尽管这个循环在五次迭代后结束,在它跳出循环控制结构时循环计数变量被增加了六次。既然该循环控制变量是一个实例数据成员,第六次增加触发了已由循环计数变量提供的循环结束条件。既然相同实例的一个方法被用做匿名方法的委托处理器,在委托结束时被调用,所有委托的实例将被指向相同实例,同时将为数据成员显示相同值,就是6。这就是我在本节开始已提到过的有危险影响的一面。

  为了克服这个问题并获得预期的结果,匿名方法应该在for循环的作用域中捕获一个局部变量,它将有与循环计数变量的相同的值。这可以通过如下修改示例代码获得:

public class Program
{
 public delegate void MyDelegate();
 public static void Main(string[] args)
 {
  MyDelegate d = null;
  for (int i = 1; i <= 5; i++)
  {
   int k = i;
   MyDelegate tempD = delegate
   {
    Console.WriteLine(k);
   };
   d += tempD;
  }
  d();
 }
}

  在你运行上面的代码示例时,将会获得预期的输出,也就是:

  1
  2
  3
  4
  5

  原因就是,C#编译器将为for循环的每次迭代而包装局部变量''k''的内部类创建 实例。同时包装了每个循环迭代的实例上的匿名方法的这个方法被用做一个委托处理器。

转载于:https://www.cnblogs.com/zgqys1980/archive/2007/06/20/790035.html

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

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

相关文章

不可以!

描述 判断&#xff1a;两个数x、y的正负性。 要求&#xff1a;不可以使用比较运算符&#xff0c;即”<”,”>”,”<”,”>”,””,”!”。 输入 有多组数据&#xff0c;每组数据占一行&#xff0c;每一行两个数x&#xff0c;y。 x、y保证在int范围内。 输出 …

树的基本概念

0x01 树 树&#xff1a;n个结点的有限集合&#xff0c;n0&#xff0c;空树任何非空树只有一个根结点n个结点的树只有n-1条边&#xff08;除根结点&#xff0c;每个结点只有一个前驱&#xff0c;一个前驱一条边&#xff0c;根据这个算的&#xff09;有序树与无序树&#xff1a;…

制作两个字符串字谜的最小步骤数

Prerequisite: 先决条件&#xff1a; Hashing data structure 散列数据结构 Problem statement: 问题陈述&#xff1a; Find the minimum number of steps to make two strings Anagram. Both strings are of the same length and the lower case. At each step, you can con…

小学计算机教学教师培训,例谈小学信息技术课堂的有效教学

例谈小学信息技术课堂的有效教学在社会的各个领域&#xff0c;大家都不可避免地会接触到论文吧&#xff0c;论文可以推广经验&#xff0c;交流认识。为了让您在写论文时更加简单方便&#xff0c;以下是小编整理的例谈小学信息技术课堂的有效教学的论文相关内容&#xff0c;供大…

关于varchar2在pl/sql和schema级别的最大值

http://www.cublog.cn/u/30637/showart_1919003.html http://www.itpub.net/thread-1216548-1-1.html  转载于:https://www.cnblogs.com/wzc998/archive/2011/08/12/2136406.html

业务工作流平台设计(九)

自定义审核活动 前面已经讲了许多有关自定义活动在设计上需要注意的一些事项&#xff0c;但对于自定义审核活动来讲&#xff0c;我们的设计还要有许多工作要进行。 为了简化用户的流程上的设计将流程的一些算法封装到自定义活动中可以大大增加自定义活动的使用的方便性。其直接…

国王的魔镜

描述 国王有一个魔镜&#xff0c;可以把任何接触镜面的东西变成原来的两倍——只是&#xff0c;因为是镜子嘛&#xff0c;增加的那部分是反的。 比如一条项链&#xff0c;我们用AB来表示&#xff0c;不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话&#xff0c;魔镜会把…

C和汇编---数组

0x01 初始化数组 1、没有初始化数组 #include "stdio.h" int main(void) {int data[4];for (int i0;i<4;i){printf("%d\t",data[i]);}return 0; }不同系统&#xff0c;输出结果可能不一样&#xff1a; 反汇编&#xff1a; 4: int data[4]; 5…

清华大学计算机组成与体系结构,清华大学出版社-图书详情-《计算机组成与体系结构(第2版)》...

作为“21世纪大学本科计算机专业系列教材”&#xff0c;遵照本系列教材评审组专家的意见&#xff0c;本书包括了数字电路基础、计算机组成、计算机体系结构3个部分内容。本书读者对象主要是学习计算机课程的大学生&#xff0c;包括计算机系的学生、软件学院的学生和非计算机专业…

txt如何单独单独选择一列_散列| 单独链接以解决冲突

txt如何单独单独选择一列Prerequisite: Hashing data structure 先决条件&#xff1a; 哈希数据结构 单独链接 (Separate chaining) In separate chaining, we maintain a linked chain for every index in the hash table. So whenever there is a Collison the linked list …

[我研究]Behavior Based Software Theft Detection - Hawk

Xinran Wang, Yoon-Chan Jhi, Sencun Zhu, Peng LiuPSU 背景&#xff1a; Behavior Based Software Theft Detection的系统包含四个步骤&#xff1a; 1、Dynamic Analysis - 产生System Call, Call Stack, Dependences 2、Noise Filtering 3、Extract SCDG Birthmarks 4、Compa…

整除个数

描述 1、2、3… …n这n(0< n<1000000000)个数中有多少个数可以被正整数b整除。 输入 输入包含多组数据 每组数据占一行&#xff0c;每行给出两个正整数n、b。 输出 输出每组数据相应的结果。 样例输入 2 1 5 3 10 4 样例输出 2 1 2 思路&#xff1a;一开始…

2020计算机二级题库第14PPT,计算机二级考试MSOffice考精彩试题库ppt操作题附问题详解.doc...

文档介绍&#xff1a;请在【答题】菜单下选择【进入考生文件夹】命令,并按照题目要求完成下面的操作。注意:以下的文件必须保存在考生文件夹下文慧是新东方学校的人力资源培训讲师,负责对新入职的教师进行入职培训,其PowerPoint演示文稿的制作水平广受好评。最近,她应北京节水展…

操作系统 系统开销比率_操作系统中的最高响应比率下一个(HRRN)调度

操作系统 系统开销比率操作系统中的HRRN调度是什么&#xff1f; (What is HRRN Scheduling in Operating System?) HRRN is the abbreviation of Highest Response Ratio Next Scheduling. It is an optimal scheduling algorithm. HRRN是最高响应率下一个调度的缩写 。 这是…

利用堆栈做循环

程序&#xff1a; #include "stdio.h" int main(int argc,char *argv[]) {char *str"%d";printf("hello world");__asm{ log:lea eax,logpush eaxlea ebx,strpush ebxpush eaxcall printfret 8}return 0;}运行&#xff1a;一直死循环运行下去 …

c# 多线程异步demo

一个 c# winform 多线程异步demo&#xff0c;分享下。 因为例子都很简单&#xff0c;所以不多说明&#xff0c;自己下载吧。转载于:https://www.cnblogs.com/chaobao/archive/2011/08/18/CSharpSync.html

(转)项目管理知识体系术语 123

项目管理知识体系术语(一)本词汇集包括和不包括的术语这个词汇集包括的词汇是&#xff1a;对于项目管理是唯一的&#xff0c;或接近于唯一的词汇(例如&#xff1a;范围说明&#xff0c;工作单元&#xff0c;工作分解结构&#xff0c;关键线路法)。对于项目管理是不是唯一的&…

矩形的个数

描述 在一个3*2的矩形中&#xff0c;可以找到6个1*1的矩形&#xff0c;4个2*1的矩形3个1*2的矩形&#xff0c;2个2*2的矩形&#xff0c;2个3*1的矩形和1个3*2的矩形&#xff0c;总共18个矩形。 给出A&#xff0c;B,计算可以从中找到多少个矩形。 输入 本题有多组输入数据&a…

计算机编程要哪方面天赋,编程要哪门子天赋

开局一张图写代码真的需要天赋吗&#xff1f;有句话是这样说的&#xff1a;论大家的努力程度&#xff0c;远不到拼天赋的时候。我认为所谓的天赋&#xff0c;应该是行业内Top10%水平才需要天赋&#xff0c;比如Linux缔造者Linus Torvalds&#xff0c;苹果发明者斯蒂夫沃兹尼亚克…

VBA之EXCEL删除和设置单元格行高等

‘删除Sheet1上的单元格区域A1:D10,并将其余单元格左移以填补被删除单元格的位置 Sheet1.Range(“A1:D10”).Delete Shift:xlShiftToLeft ‘删除指定行 Range(“1:1”).Delete ‘删除指定列 Columns(5).Delete ‘删除当前行 ActiveCell.EntireRow.Delete ‘删除工作表中的重复行…