我正在使用一个api,不幸的是,调用get属性访问器有副作用。我如何确保:
public void Foo()
{
var x = obj.TheProp; // is it guarnateed to be accessed?
}
不是被编译器优化了吗?
最佳答案
这不会被优化掉——getter是一种方法,它将被调用,尽管jit可能会选择“内联”很多它,如果它很简单,也许最终(并且完全理论上)如果TheProp
没有做任何特别令人兴奋的事情,只会得到一个空引用检查。可能发生的情况是,“返回的东西”(代码存储到x
)在方法结束之前有资格进行垃圾收集;这很少是问题,除了进程外互斥体之类的东西;在这种情况下,您可以执行如下操作:
var x = obj.TheProp;
// long-running code here
GC.KeepAlive(x);
但是,请注意,如果
x
是值类型的,这将强制将其装箱,这并不理想。不过,强调:上面的内容并不是为了确保实际调用
TheProp
,而是为了一组特定的与垃圾相关的场景。