c#闭包(转)
出处:http://www.cnblogs.com/birdwudi/archive/2010/08/20/1804342.html
------------------------------------------------------------------------------
简单来讲,闭包允许你将一些行为封装,将它像一个对象一样传来递去,而且它依然能够访问到原来第一次声明时的上下文 奇怪的局部变量:讨论一下C#中的闭包 []静态全局字段 C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication3
{
class Program
{
public static int copy;//[0]这个不是闭包
static void Main()
{
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
copy = counter;
actions.Add(() => Console.WriteLine(copy));
}
//执行动作
foreach (Action action in actions) action();
}
}
} //注:Action定义如下:
//public delegate void Action(); []局部变量(闭包一) C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication3
{
class Program
{
static void Main()
{
int copy;//[1]闭包一
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
copy = counter;
actions.Add(() => Console.WriteLine(copy));
}
//执行动作
foreach (Action action in actions) action();
}
}
} //注:Action定义如下:
//public delegate void Action(); []局部变量(闭包二) C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication3
{
class Program
{
static void Main()
{
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
int copy;//[1]闭包二
copy = counter;
//int copy = counter;//换种写法
actions.Add(() => Console.WriteLine(copy));
}
//执行动作
foreach (Action action in actions) action();
}
}
} //注:Action定义如下:
//public delegate void Action(); []局部变量(闭包三) C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication3
{
class Program
{
static void Main()
{
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)//[3]闭包三
{
actions.Add(() => Console.WriteLine(counter));
}
//执行动作
foreach (Action action in actions) action();
}
}
} //注:Action定义如下:
//public delegate void Action(); []:输出什么?
[]:输出什么?
[]:输出什么?
[]:输出什么? 这几个例子,可以将匿名函数进行转换,这样可以看的更清楚
在[]中,“外部变量”copy是类的一个静态成员,因此可以讲匿名函数转换为以下形式: C# code class Program
{
public static int copy;//[0]这个不是闭包
static void TempMethod()
{
Console.WriteLine(copy);
}
static void Main()
{
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
copy = counter;
actions.Add(new Action(TempMethod));
}
//执行动作
foreach (Action action in actions) action();
}
} [],[]中“外部变量”copy是Main方法中的局部变量,局部变量的生存期现在必须至少延长为匿名函数委托的生存期。这可以通过将局部变量“提升”到编译器生成的类的字段来实现。之后,局部变量的实例化对应于为编译器生成的类创建实例,而访问局部变量则对应于访问编译器生成的类的实例中的字段。而且,匿名函数将会成为编译器生成类的实例方法: C# code class Program
{
static void Main()
{
//定义动作组
TempClass tc = new TempClass();
//定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
tc.copy = counter;
actions.Add(tc.TempMethod);
}
//执行动作
foreach (Action action in actions) action();
}
class TempClass
{
public int copy;
public void TempMethod()
{
Console.WriteLine(copy);
}
}
} C# code class Program
{
static void Main()
{
//定义动作组 //定义动作组
List<Action> actions = new List<Action>();
for (int counter = ; counter < ; counter++)
{
TempClass tc = new TempClass();
tc.copy = counter;
actions.Add(tc.TempMethod);
}
//执行动作
foreach (Action action in actions) action();
}
class TempClass
{
public int copy;
public void TempMethod()
{
Console.WriteLine(copy);
}
}
} []中的“外部变量”counter是for循环的循环因子,因此可以转换为以下形式: C# code class Program
{
static void Main()
{
//定义动作组
List<Action> actions = new List<Action>();
TempClass tc = new TempClass();
for (tc.copy = ; tc.copy < ; tc.copy++)
{
actions.Add(new Action(tc.TempMethod));
}
//执行动作
foreach (Action action in actions) action();
}
class TempClass
{
public int copy;
public void TempMethod()
{
Console.WriteLine(copy);
}
}
}
c#闭包(转)的更多相关文章
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- 干货分享:让你分分钟学会 JS 闭包
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
- 深入浅出JavaScript之闭包(Closure)
闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...
- javascript之闭包理解以及应用场景
半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...
- js闭包 和 prototype
function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...
- js闭包for循环总是只执行最后一个值得解决方法
<style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;curso ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- 如何设计一门语言(七)——闭包、lambda和interface
人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...
- JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
随机推荐
- JQuery动画效果
jquery动画效果常用方法 1.show()显示效果语法:show(speed,callback)Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slo ...
- NetBios 的结构体详解
[NetBios 的结构体详解] NetBIOS是早期的局域网传输协议. 1.结构体. 2.命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式. 如果命令码的高阶位是0时 ...
- Ptex源码学习笔记-1
Ptex是Walt Disney Animation Studios开发的纹理映射工具.在看一个叫appleseed的渲染器时看到他支持这种纹理,所以就查看一下,发现比较轻量,所以就想趁此机会学习下. ...
- 阐述程序员如何实现IT职业定位
[动力IT职业生涯规划课]阐述程序员如何实现IT职业定位 2016年9月16日下午17:00,南通动力IT教育创始人阙海忠先生,亲自向动力IT学员传授其十八年IT从业经验. 一个程序员的完美人生定位 ...
- 转发(forward)和重定向(sendRedirect)
一. RequestDispatche 是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中.详细来说:RequestDispatch对象从客户端获取 ...
- PTA Hashing
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- 一天一经典Reducing the Dimensionality of Data with Neural Networks [Science2006]
别看本文没有几页纸,本着把经典的文多读几遍的想法,把它彩印出来看,没想到效果很好,比在屏幕上看着舒服.若用蓝色的笔圈出重点,这篇文章中几乎要全蓝.字字珠玑. Reducing the Dimensio ...
- SpringAOP详解(转载大神的)
AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之.翻译过来就是"面向方面编程&q ...
- python学习之——django环境搭建
Django是一个基于MVC构造的框架,用于web开发,主要目的是简便.快速的开发数据库驱动的网站. 前提:已经安装python 搭建步骤: 1.https://www.djangoproject.c ...
- css 字间距、CSS字体间距、css 字符间距设置
1.text-indent设置抬头距离css缩进 2.letter-spacing来设置字与字间距_字符间距离,字体间距css样式