gpt4 book ai didi

c# - 匿名函数的强制参数评估

转载 作者:行者123 更新时间:2023-11-30 18:41:11 26 4
gpt4 key购买 nike

我想知道是否有简单的方法可以强制对匿名函数进行参数评估?意义重大

用于多线程编程。例如当我写

        for(int i=0; i<5; ++i)
{
Task.Factory.StartNew(() => Console.WriteLine(i));
}

大多数人会得到“5”五次。事实上,代码片段更有可能输出 0 到 5。

一个快速的解决方案如下:

        for(int i=0; i<5; ++i)
{
var local = i;
Task.Factory.StartNew(() => Console.WriteLine(local));
}

我认为如果存在以下方法来评估匿名函数的所有参数并返回一个与原点相同的逻辑,生活会更好:

    Action EvaluateParameters(Action action)

有什么想法吗?

谢谢。

最佳答案

我不知道如果没有编译器或框架支持,这样的方法是否甚至(合理)可行。最后,编译器确实会生成代码来提升变量,而不是它在您创建委托(delegate)时的值,这会导致该行为。

基本上,您必须“执行”“EvaluteParameters”中的委托(delegate)才能使其正常工作。或者也许摆弄表达式可以以某种方式做到这一点。

顺便说一句,如果委托(delegate)是在循环内部创建但在循环外部(之后)调用的,这只是一个问题。

哦,ReSharper 确实有一个警告(尽管它有时是“错误的”或过于迂腐)。

无论如何,Jon Skeet 在他的书(深入了解 C#)中确实提到,社区中确实对此存在一些困惑,并且微软正在考虑可能在未来的版本中改变行为(希望我从内存)。如果不破坏依赖于当前行为(或因此而意外工作)的现有代码,这甚至可能是不可能的。

关于c# - 匿名函数的强制参数评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175146/

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