确保声明未被优化"远离"

时间:2014-10-13 14:27:17

标签: c# .net properties

我正在使用API​​,不幸的是,调用get属性访问器会产生副作用。我该如何确保:

public void Foo()
{
  var x = obj.TheProp; // is it guarnateed to be accessed?
}

没有被编译器优化掉?

1 个答案:

答案 0 :(得分:6)

这将不会被优化掉 - getter是一个方法并且将被调用,尽管JIT可能会选择" inline"很多,如果它很简单,也许最终(并且完全在理论上)最终仅使用空引用检查,如果TheProp没有做任何特别令人兴奋的事情。 可以发生的是"返回" (代码存储到x)在方法结束之前有资格进行垃圾回收;这很少是一个问题,除了像进程外互斥的东西;在这种情况下,您可以执行以下操作:

var x = obj.TheProp;
// long-running code here
GC.KeepAlive(x);

但是请注意,如果x是值类型的,这将强制它被装箱,这是不理想的。

强调:上面的旨在确保实际调用TheProp;它适用于一组特定的垃圾相关场景。