gpt4 book ai didi

c# - 内部匿名方法中变量的作用域

转载 作者:行者123 更新时间:2023-11-30 20:00:39 25 4
gpt4 key购买 nike

查看代码

public class Test
{
public static void Main()
{
Test t = new Test();
var AnonymousMethod = t.OuterMethod();
AnonymousMethod("passedValue");
}
public delegate void SampleDelegate(string InputText);

public SampleDelegate OuterMethod()
{
string outerValue="outerValue";
return (x => {
Console.WriteLine(x);
Console.WriteLine(outerValue);
});

}
}

输出

Success  time: 0.02 memory: 33816 signal:0
passedValue
outerValue

链接到 Example

通常情况下,变量 outerValue 的作用域会在调用 t.OuterMethod() 后结束。但是在使用匿名类型的情况下,Console 清楚地打印输出(Console.WriteLine(outerValue)),这意味着变量的范围没有结束。编译器实际上做了什么来确定它的范围?它会将 Main 方法的范围分配给匿名方法中使用的变量吗?我知道如何使用,但不知道它是如何工作的。请指导我?

编辑

Suppose the anonymous method attached to an event. The event might be executing a lot later. Then the variable would be in memory. rite? If a lot of events assigned, a lot of memory!. Its a bad thing I suppose. Did I make any mistake?

最佳答案

变量的范围(程序文本中可以无限制地引用它的区域)保持不变。

有效地延长了变量的“生命周期”:lambda 表达式捕获 变量。编译器将为您生成一个私有(private)嵌套类,其中包含该变量 - 方法和委托(delegate)都引用该嵌套类的同一个实例,并且该实例将不符合垃圾回收条件,直到该方法不再引用到它并且委托(delegate)实例有资格进行垃圾收集。

关于c# - 内部匿名方法中变量的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20517711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com