gpt4 book ai didi

c# - 闭包不应该分配吗?

转载 作者:行者123 更新时间:2023-11-30 15:13:27 25 4
gpt4 key购买 nike

我一直从闭包创建分配的观点出发,应该避免在关键代码中出现,这个观点过时了吗?

enter image description here

using System;

public class Foo
{
private Random rand = new Random();

private static int Get(Func<int> factory)
{
return factory() + 1;
}

public void Test()
{
Console.WriteLine("foobar");

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

float foo = 1f;

for (int i = 0; i < 100000; i++)
{
foo += DoTestRun();
}
}

private float DoTestRun()
{
var j = rand.Next(0, 100);
return Get(() => j + 5);
}
}
class Program
{
static void Main()
{
new Foo().Test();
}
}

最佳答案

是的,他们确实分配;这是 devenv 中分配调试器的顶部:

Name    Total (Allocations) Total Size (Bytes)
+ System.Func`1 100002 6400128
| + [Native] 100002 6400128
|| + Program::Main 100002 6400128
||| + Foo::Test 100002 6400128
|||| - Foo::DoTestRun 51190 3276160
|||| - Foo::DoTestRun 48810 3123840
|||| - System.Console.WriteLine(System.String) 2 128
+ Foo.<>c__DisplayClass3_0 100000 2400000
| + [Native] 100000 2400000
|| + Program::Main 100000 2400000
||| + Foo::Test 100000 2400000
|||| - Foo::DoTestRun 51190 1228560
|||| - Foo::DoTestRun 48810 1171440

这些是来自 Get(() => j + 5) 的委托(delegate)和捕获上下文实例。所以是的,它分配。这对您的场景是否是灾难性的:在很大程度上取决于您的场景。

关于c# - 闭包不应该分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58749233/

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