我正在使用一个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,而是为了一组特定的与垃圾相关的场景。

09-10 03:55