【问题标题】:Is there such a thing as a "Javascript context" in C# [duplicate]C#中是否有“Javascript上下文”之类的东西[重复]
【发布时间】:2018-01-07 16:23:09
【问题描述】:

如果我将以下代码视为 Javascript 代码,那将是有道理的……但是 Main 中的调用 action() 怎么不会为 i 产生 NullReferenceException? Action 是否抓取了 JavaScript 上下文之类的东西?提前谢谢大家。

public class Program
{
    static void Main(string[] args)
    {
        var p = new Program();
        var action = p.method();
        action();
        Console.ReadKey();

    }

    public Action method()
    {
        var i = 6;
        Action action = () => Console.WriteLine(i);
        i++;
        return action;
    }

}

输出>>7

【问题讨论】:

  • 您要查找的词是“关闭”,而不是上下文。如果你搜索“C#闭包”,关于这个话题有相当多的信息,但本质上,i 是从method 中提取到它的闭包中,这使得它在离开method 的范围后仍然存在。

标签: javascript c# delegates action


【解决方案1】:

method 中创建的 lambda 捕获 lambda 内引用的所有变量。

见这篇文章:https://blogs.msdn.microsoft.com/matt/2008/03/01/understanding-variable-capturing-in-c/

【讨论】:

  • 如果您在文章中链接的变量“名称”是原始类型,则 Capture 类将获得一个副本,并且调用方法中的任何更改都不会反映在 Capture 类中。然而他们是?我知道,Capture 类只是一个我认为面向引用类型的想法。
  • 不正确 - 所有对以前本地内容的引用现在都是对 Capture 类的字段的引用。变量/字段的类型无关紧要。
  • 但是当我们更改主方法中的“名称”时,Capture 的字段会发生变化……这会发生在 Capture 类使用它自己的该变量的副本创建之后?
  • 如果您检查示例(向下滚动),编译器会将 main 函数更改为引用 Capture 实例字段,因为它替换了局部变量。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多