我有一堆采用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总是很糟糕。