欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

C#实现在匿名方法中捕获外部变量的方法

时间:2021-02-05 09:32:37|栏目:.NET代码|点击:

先来一段代码引入主题。如果你可以直接说出代码的输出结果,说明本文不适合你。(代码引自《深入理解C#》第三版)

class Program
  {
    private delegate void TestDelegate();
 
    static void Main(string[] args)
    {
      TestDelegate[] delegates = new TestDelegate[2];

      int outside = 0;

      for(int i = 0; i < 2; i++)
      {
        int inside = 0;

        delegates[i] = delegate
        {
          Console.WriteLine("({0},{1})", outside, inside);
          outside++;
          inside++;
        };
      }

      delegates[0]();
      delegates[0]();
      delegates[0]();

      delegates[1]();
      delegates[1]();

      Console.ReadKey();
    }
  }


答案在本文最下方。

先引入两个定义:

1、外部变量:是指作用域内包括匿名方法的局部变量或参数。

2、捕获的外部变量:是指在匿名方法中使用的外部变量。

定义有点抽象,针对上面的代码而言,inside和outside都是匿名方法的外部变量,而inside和outside同样也作为被匿名方法捕获的外部变量,因为在匿名方法体中引用了这两个变量。

而被匿名方法捕获到的是变量本身,而并非变量的值。针对上面的代码而言,执行outside++和inside++时,操作的其实就是外部的inside和outside变量。

至此,我们应该可以得出outside的变化应该是从0到4。

那么程序的输出也应该是这个样子的:(X代码未知)

(0,X)

(1,X)

(2,X)

(3,X)

(4,X)

 

实际上,在for循环体里面做的东西就是实例化了两个TestDelegate委托对象:delegate[0]和delegate[1]

而循环的执行,实际上会实例化两个名称都为inside的变量。

这两个变量之间没有什么关联,仅仅是名称一样而已。

这两个变量分别作为delegate[0]和delegate[1]的外部捕获变量。也就是delegate[0]和delegate[1]在操作inside时,是互不影响的。

于是,得出答案:

(0,0)

(1,1)

(2,2)

(3,0)

(4,1)

答案

上一篇:WPF下YUV播放的D3D解决方案

栏    目:.NET代码

下一篇:NetCore WebSocket即时通讯示例

本文标题:C#实现在匿名方法中捕获外部变量的方法

本文地址:http://www.codeinn.net/misctech/57388.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有