gpt4 book ai didi

c# - 卡住闭包的优雅方式

转载 作者:太空宇宙 更新时间:2023-11-03 19:08:37 25 4
gpt4 key购买 nike

是否有任何优雅的方法来“卡住”从方法返回的操作中使用的变量?

看看下面的代码:

static void Main(String[] args) 
{
foreach(Action a in ClosureTrap("a", "b"))
{
a();
}
}

static List<Action> ClosureTrap(params String[] strings)
{
List<Action> result = new List<Action>();
foreach(String s in strings)
{
result.Add(() => Console.WriteLine(s));
}
return result;
}

此代码将向控制台写入两行,均包含“b”。原因不难发现:ClosureTrap 中“s”的最后一个值是“b”。

有什么优雅的方法可以在控制台上输出两行“a”和“b”吗?

目前我正在使用一种额外的方法来创建委托(delegate)。但是通过这样做,闭包失去了很多优雅:

static List<Action> ClosureTrap(params String[] strings) 
{
List<Action> result = new List<Action>();
foreach(String s in strings)
{
result.Add(Freeze(s));
}
return result;
}

static Action Freeze(String s)
{
return () => Console.WriteLine(s);
}

有更好的方法吗?

最佳答案

没有一般的方法来做到这一点 - 但如果您只是被 foreach特定问题所困扰,那么有两个选项:

  • 开始使用 C# 5 编译器(您不需要以 .NET 4.5 或类似的目标为目标)。 The rules around captured foreach iteration variables changed (to sane ones) for C# 5.
  • 如果您受困于 C# 3 或 4,请捕获一个局部变量在循环中声明:

    foreach(String s in strings) 
    {
    string copy = s;
    result.Add(() => Console.WriteLine(copy));
    }

    这样,循环的每次迭代都会捕获一个单独的变量,该变量的值永远不会改变。

关于c# - 卡住闭包的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23296532/

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