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