【.Net基础拾遗】匿名方法中的捕捉变量(探讨文)

  最近在和朋友讨论的时候发现了一个很有意思的问题,就是捕捉变量,我现在下面把代码贴出来,大家可以先猜猜结果,然后我们在一起讨论为什么。

 1 public class Test
 2     {
 3         private int k = 0;
 4         private List<Action> dg1s = new List<Action>(), dg2s = new List<Action>(), dg3s = new List<Action>();
 5         public void forTest()
 6         {
 7             for (int i = 0; i < 5; i++)
 8             {
 9                 var j = i;
10                 k = i;
11                 dg1s.Add(() => Console.WriteLine("i:" + i));
12                 dg2s.Add(() => Console.WriteLine("j:" + j));
13                 dg3s.Add(() => Console.WriteLine("k:" + k));
14             }
15         }
16
17         public void Show()
18         {
19
20             forTest();
21             dg1s.ForEach(c => c());
22             dg2s.ForEach(c => c());
23             dg3s.ForEach(c => c());
24
25         }
26
27     }

  Main方法:

1 static void Main(string[] args)
2         {
3             new Test().Show();
4             Console.ReadLine();
5         }

  其实这一块我也有点疑问,希望大家可以在评论中一起探讨。

时间: 2024-12-16 15:32:38

【.Net基础拾遗】匿名方法中的捕捉变量(探讨文)的相关文章

C#:在匿名方法中捕获外部变量

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

5.5 匿名方法中的捕获变量

class Program { static void Main(string[] args) { MethodInvoker m = CreateInvoker(); m(); m(); Console.ReadKey(); } static MethodInvoker CreateInvoker() { int count = 5; MethodInvoker ret = delegate { Console.WriteLine(count); count++; }; ret(); retu

匿名方法中的变量

前面一篇文章看到了C# 2.0中通过匿名方法来简化委托,下面来看看匿名方法中的变量. 闭包和不同的变量类型 闭包的基本概念是:一个函数除了能够通过提供给它的参数与环境交互之外,还能同环境进行更大程度的互动.对于C# 2.0中出现的匿名方法的闭包表现为,匿名方法能使用在声明该匿名方法的方法内部定义的局部变量. 在进一步了解闭包之前,我们先看看下面两个术语: 外部变量(outer variable):是指其作用域(scope)包括一个匿名方法的局部变量或参数(ref和out参数除外) 被捕捉的外部变

[C#] C# 基础回顾 - 匿名方法

C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,我们会用 Lambda 表达式进行取代匿名方法,并且用 Lambda 表达式作为编写内联代码的首选方式,因为它更简洁. 匿名方法是,顾名思义,匿名方法就是没有名称的方法.匿名方法最明显的好处就是:可以降低额外另写一个方法的工作量:另外一个好处就是可以直接访问调用者的变量,

C#基础知识---匿名方法使用

一.匿名方法使用 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace AnonymousMethod 8 { 9 delegate void DelegateWithoutArguments(); 10 delegate void DelegateWithArgument

黑马程序员---Objective-C基础学习---点方法使用和成员变量的作用域

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.点语法 oc设计点语法的目的就是让其他语言的开发者能快速上手oc这门语言,oc点语法与java里面很像,那什么是点语法呢,点语法怎么用呢? 1.点语法和set和get方法有关 这里新建一个项目,添加一个Person类 Person.h 1 // 2 // Person.h 3 // zijia 4 // 5 // Created by zou on 5/10/15. 6 // Copyri

CI控制器中设置在其它方法中可用的变量

开发过程中,某些变量可能需要被控制器中的其它方法所调用,这个变量改怎么设置呢? 其实可以用ci的$this->load->vars($array);和$this->load->get_var($key);来实现. 数组可以在构造函数中设置,在方法中可以用get_var($key)获取value. class User extends CI_Controller{ public function __construct() { parent::__construct(); $arr

不能用private修饰方法中定义的变量

在敲代码时发现了一个自己之前没有注意到点:(确切来说是没有认真理解权限修饰符)在方法中定义变量时,不能加权限修饰符原因如下: 原文地址:https://blog.51cto.com/14234228/2468546

处理async void 方法中无法捕捉异常信息

利用 NuGet库 Nito.AsyncEx 中的 AsyncContext类. 添加NuGet类库,使用AsyncContext AsyncContext.Run(Action action);