我有一堆采用WPF的方法 WriteableBitmap
并从中读取 BackBuffer
直接使用不安全的代码。
我是否应该使用它并不完全清楚 GC.KeepAlive
每当我做这样的事情:
int MyMethod(WriteableBitmap bmp)
{
return DoUnsafeWork(bmp.BackBuffer);
}
一方面,仍有提及 bmp
上 MyMethod
堆栈。另一方面,它似乎依赖于实现细节 - 这可以编译为尾调用,例如,不保留引用 bmp
此时此刻 DoUnsafeWork
输入。
同样,想象下面的假设代码:
int MyMethod()
{
WriteableBitmap bmp1 = getABitmap();
var ptr = bmp.BackBuffer;
WriteableBitmap bmp2 = getABitmap();
return DoUnsafeWork(ptr, bmp2);
}
在理论上,参考 bmp1
在方法返回之前,它仍保留在堆栈中,但同样,它似乎使用了实现细节。当然编译器可以自由合并 bmp1
和 bmp2
因为它们永远不会同时存在,即使编译器从来没有这样做,JITter仍然可以,并且可能会(例如通过将它们存储在同一个寄存器中,第一个,然后另一个)。
所以,一般来说:我应该依赖locals / arguments作为对象的有效引用,还是应该总是使用 GC.KeepAlive
保证正确吗?
这显然是令人费解的,显然, FxCop认为GC.KeepAlive总是很糟糕。