了解 C# 中的变量捕获

捕获变量时,会创建一个包装类


例子:

   1: static void Main(string[] args)
    2: {
    3:     Console.WriteLine("Variable Capturing");
    4:  
    5:     string name = "Matthew";
    6:     Func<String> capture = () => name;
    7:  
    8:     name = "Mallory";
    9:  
   10:     Print(capture);
   11:  
   12: }
   13:  
   14: static void Print(Func<string> capture)
   15: {
   16:     Console.WriteLine(capture());
   17: }

变量“name”在第 6 行的 lambda 表达式内被捕获。然后在第 8 行修改相同的变量。然后在第 10 行,我们将 lambda 表达式传递给 Print 函数,然后打印出捕获的变量。当代码运行时,输出将是:

Mallory


值得注意的是,虽然变量“name”在第 6 行被“捕获”,但它反映了第 8 行对局部变量“name”所做的更改。要了解它是如何工作的,让我们展示一下 C# 编译器将大致变成什么之前的代码进去。(我将匿名类型的名称更改为更具可读性):

  1: public class Capture
    2: {
    3:     public string name;
    4:  
    5:     public string Lambda()
    6:     {
    7:         return this.name;
    8:     }
    9:  
   10: }
   11:  
   12: static void Main(string[] args)
   13: {
   14:     Capture capture = new Capture();
   15:  
   16:     Console.WriteLine("Variable Capturing");
   17:  
   18:     capture.name = "Matthew";
   19:  
   20:     capture.name = "Mallory";
   21:  
   22:     Print(capture.Lambda);
   23: }
   24:  
   25: static void Print(Func<string> capture)
   26: {
   27:     Console.WriteLine(capture());
   28: }


创建了一个名为“Capture”的新类。原始代码中所有出现的变量“name”都被替换为对捕获类的“name”成员的字段访问。此外,lambda 表达式变成了我称之为 Lambda 的捕获类上的一个方法(是的,这就是所有匿名委托和 lambda 表达式)。这就是变量的更改如何在 lambda 表达式中持久化,对变量的每次更改只会修改 Capture 类中的字段。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864