栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

NET中如何实现匿名方法中的捕获值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

NET中如何实现匿名方法中的捕获值

找出实现方式的最简单方法就是尝试一下。编写一些代码,使用捕获的变量,对其进行编译,然后在Reflector中对其进行查看。请注意,捕获的是 变量 ,而不是 value
。这是Java和C#在此方面的最大区别之一。

基本思想是,包含至少一个捕获变量的范围的每个级别都会导致一个新类,其中包含已捕获变量的字段。如果存在多个级别,则内部作用域还具有用于下一个作用域的字段,依此类推。堆栈上真正的局部变量最终将引用自动生成类的实例。

这是一个例子:

using System;using System.Collections.Generic;class Program{    static void Main()    {        List<Action> actions = new List<Action>();        for (int i=0; i < 5; i++)        { int copyOfI = i; for (int j=0; j < 5; j++) {     int copyOfJ = j;     actions.Add(delegate     {         Console.WriteLine("{0} {1}", copyOfI, copyOfJ);     }); }        }        foreach (Action action in actions)        { action();        } }}

(如果不学习课程,您将得到不同的结果-实验!)这将编译为如下代码:

using System;using System.Collections.Generic;class Program{    static void Main()    {        List<Action> actions = new List<Action>();        for (int i=0; i < 5; i++)        { OuterScope outer = new OuterScope(); outer.copyOfI = i; for (int j=0; j < 5; j++) {     InnerScope inner = new InnerScope();     inner.outer = outer;     inner.copyOfJ = j;     actions.Add(inner.Action); }        }        foreach (Action action in actions)        { action();        } }    class OuterScope    {        public int copyOfI;    }    class InnerScope    {        public int copyOfJ;        public OuterScope outer;        public void Action()        { Console.WriteLine("{0} {1}", outer.copyOfI, copyOfJ);        }    }}

对捕获变量的每个引用最终都要经过所生成类的实例,因此它不仅仅是一次性复制。(好的,在这种情况下,代码中没有其他任何东西使用捕获的变量,但是您可以很容易地想象得到。)请注意,对于外循环的任何一次迭代,五个
新实例都共享一个的实例

OuterScope
。您可能想尝试在委托中使用额外的代码,以查看其如何影响事物-如果
委托更改
copyofI
,则将在下一个委托中看到更改;不会看到对的更改,
copyOfJ
因为下一个委托将使用的单独实例I
nnerScope




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号