gpt4 book ai didi

c# - 委托(delegate)、操作和内存分配

转载 作者:太空狗 更新时间:2023-10-29 17:33:14 26 4
gpt4 key购买 nike

我目前正在处理需要最少内存分配的代码块。

我注意到,如果我对参数使用方法,编译器会更改代码并创建一个新的 Action,但如果我使用匿名方法,编译器会创建一个委托(delegate) block 。我知道新的 Action 分配内存,但我不太确定委托(delegate)。委托(delegate)在使用时会分配内存吗?

我的代码:

bool workfinished = false;

void DoWork()
{
MyMethod(CallBack1Work, ()=>{ workfinished = false;});
}

void MyMethod(Action callback1, Action callback2)
{
}

void CallBack1Work()
{
}

编译器版本:

bool workfinished = false;

void DoWork()
{
MyMethod(new Action( CallBack1Work ), delegate{ workfinished = false;});
}

void MyMethod(Action callback1, Action callback2)
{
}

void CallBack1Work()
{
}

void DoWork_b01()
{
workfinished = false;
}

最佳答案

如果您使用不捕获任何内容的 lambda 表达式,编译器将生成一个静态字段来缓存它。因此使用它,您可以更改 ActionAction<YourClass>并用 this 调用它.所以:

class YourClass
{
private bool workFinished;

public void DoWork()
{
MyMethod(instance => instance.Callback1Work(),
instance => instance.workFinished = false);
}

private void MyMethod(Action<YourClass> callback1,
Action<YourClass> callback2)
{
// Do whatever you want here...
callback1(this);
// And here...
callback2(this);
}

private void Callback1Work()
{
// ...
}
}

第一次只会创建委托(delegate)实例DoWork任何 实例上被调用。然后将缓存委托(delegate)以供所有实例上的所有 future 调用使用。

诚然,这都是一个实现细节。你总是可以让它更清楚:

class YourClass
{
private static readonly Action<YourClass> Callback1 = x => x.Callback1Work();
private static readonly Action<YourClass> Callback2 = x => x.workFinished = false;

private bool workFinished;

public void DoWork()
{
MyMethod(Callback1, Callback2);
}

... code as before ...
}

不过,在深入了解这些长度之前,对代码进行分析和基准测试是值得的。

另一种选择是坚持 Action ,但是为委托(delegate)创建实例变量——所以只要你调用DoWork在同一个实例上多次,你会没事的:

class YourClass
{
private readonly Action foo;
private readonly Action bar;

private bool workFinished;

public YourClass()
{
foo = Callback1Work;
bar = () => workFinished = false;
}

public void DoWork()
{
MyMethod(foo, bar);
}

public void MyMethod(Action callback1, Action callback2)
{
...
}

private void Callback1Work()
{
...
}
}

关于c# - 委托(delegate)、操作和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20357737/

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