gpt4 book ai didi

c# - 此处是否需要 GC.KeepAlive,或者我可以依靠局部变量和参数来保持对象的事件状态吗?

转载 作者:可可西里 更新时间:2023-11-01 08:43:48 37 4
gpt4 key购买 nike

我有很多方法采用 WPF 的 WriteableBitmap 并使用不安全的代码直接从其 BackBuffer 中读取。

每当我做这样的事情时,我是否应该使用 GC.KeepAlive 并不完全清楚:

int MyMethod(WriteableBitmap bmp)
{
return DoUnsafeWork(bmp.BackBuffer);
}

一方面,在MyMethod 的堆栈上仍然有对bmp 的引用。另一方面,它似乎依赖于实现细节 - 这可能会编译为尾调用,例如,在输入 DoUnsafeWork 时不保留对 bmp 的引用。

类似地,想象以下假设代码:

int MyMethod()
{
WriteableBitmap bmp1 = getABitmap();
var ptr = bmp.BackBuffer;
WriteableBitmap bmp2 = getABitmap();
return DoUnsafeWork(ptr, bmp2);
}

理论上,对 bmp1 的引用会保留在堆栈中,直到方法返回,但同样,它似乎使用了实现细节。当然,编译器可以自由合并 bmp1bmp2,因为它们永远不会同时存在,即使编译器永远不会这样做,JITter 仍然可以,并且可能会(例如,将它们都存储在同一个寄存器中,第一个,然后另一个)。

因此,一般来说:我应该依赖局部变量/参数作为对象的有效引用,还是应该始终使用 GC.KeepAlive 来保证正确性?

这尤其令人费解,因为显然,FxCop thinks GC.KeepAlive is always bad .

最佳答案

Should I rely on locals/arguments being valid references to an object?

没有。你的分析是正确的;抖动完全有权告诉垃圾收集器本地内容在托管代码不再使用时就已经死了。

should I always use GC.KeepAlive to guarantee correctness?

是的。这就是它的用途。

关于c# - 此处是否需要 GC.KeepAlive,或者我可以依靠局部变量和参数来保持对象的事件状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713779/

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