• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#实现在匿名方法中捕获外部变量的方法

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#全局变量,c#全局变量定义,c#静态变量,c#变量,c#变量命名规则等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

先来一段代码引入主题。如果你可以直接说出代码的输出结果,说明本文不适合你。(代码引自《深入理解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();
    }
  }

</div>


答案在本文最下方。

先引入两个定义:

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

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

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

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

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

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

(0,X)

(1,X)

(2,X)

(3,X)

(4,X)

</div>

 

实际上,在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)

</div>

答案

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#实现在匿名方法中捕获外部变量的方法
  • C#类中属性与成员变量的使用小结
  • C#匿名委托和Java匿名局部内部类使用方法示例
  • C#: 引用变量与数值变量的区别
  • 配置C#的系统环境变量的方法
  • 配置C#的系统环境变量的方法

相关文章

  • 2017-05-28C#实现人民币大写转换示例代码
  • 2017-05-28c#继承与多态使用示例
  • 2017-05-28c#使用filesystemwatcher监视文件系统的变化
  • 2017-05-28C#中调用命令行cmd开启wifi热点的实例代码
  • 2017-05-28C#实现将浮点数表示的货币数量以汉字大写形式输出的方法
  • 2017-05-28轻松学习C#的属性
  • 2017-05-28C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例
  • 2017-05-28浅谈C#下winform和JS的互相调用和传参(webbrowser)
  • 2017-05-28C#控制台程序中处理2个关闭事件的代码实例
  • 2017-05-28C#实现查杀本地与远程进程的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅析依赖注入框架Autofac的使用
    • C#基础入门之算法:交换
    • C#图像处理之边缘检测(Sobel)的方法
    • C#二分查找算法实例分析
    • C#中的尾递归与Continuation详解
    • c#初学简单程序实例代码介绍
    • 基于C#的socket编程的TCP异步的实现代码
    • C#和Java有什么区别和联系
    • C#生成带logo的二维码
    • 积累Visual Studio 常用快捷键的动画演示

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有