gpt4 book ai didi

c# - 代表的内存分配和缓存

转载 作者:行者123 更新时间:2023-12-04 09:34:12 25 4
gpt4 key购买 nike

我最近对使用非捕获委托(delegate)和 lambda 时编译器缓存委托(delegate)的方式感到惊讶。获取以下代码(可在 SharpLab 获得):

using System;

public class C
{
static void Use(int x, int y)
{
// #1 - Allocates delegate per call
SomeMethod(Add);

// #2 - Caches delegate, doesn't allocate each time
SomeMethod((x, y) => Add(x, y));

// #3 - Allocates delegate per call
SomeMethod(LocalAdd);

// #4 - Caches delegate, doesn't allocate each time
SomeMethod((a, b) => LocalAdd(a, b));

static int LocalAdd(int a, int b)
{
return a + b;
}
}

static int Add(int x, int y)
{
return x + y;
}

static int SomeMethod(Func<int, int, int> func)
{
return func(1, 2);
}
}
我惊讶地发现,在 #1 和 #3 的情况下,编译器不会费心缓存 Func。委托(delegate)它创建。我确实想知道 #1 的原因是否归结为历史原因(也许这是在泛型和 lambda 之前完成的方式),但直接传递本地函数的事实表明并非如此。
所以,我的问题是,为什么编译器不缓存所有情况下的委托(delegate)?我必须使用更冗长的 lambda 语法来创建缓存值,这似乎很奇怪。为什么我必须重写这个: SomeMethod(LocalAdd);作为 SomeMethod((a, b) => LocalAdd(a, b));为了让编译器缓存委托(delegate)并因此产生更少的垃圾?

最佳答案

这个话题已经讨论了相当长的一段时间,并且可以总结为:改变它可能会出现可检测的变化,这可能会导致行为变化,并导致当前工作代码中的错误。这适用的场景非常小众,并且与针对委托(delegate)实例的引用相等测试有关。
受影响的代码可以忽略不计,但是:非零,如果优化可以改变行为,通常默认为“保持兼容性”。

关于c# - 代表的内存分配和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674005/

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