确保声明没有"远离"优化

D.R*_*.R. 5 .net c# properties

我正在使用API​​,不幸的是,调用get属性访问器会产生副作用.我怎样才能确保:

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

是不是被编译器优化了?

Mar*_*ell 6

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

var x = obj.TheProp;
// long-running code here
GC.KeepAlive(x);
Run Code Online (Sandbox Code Playgroud)

但请注意,如果x是值类型,则会强制将其装箱,这并不理想.

但重点是:上述内容并非旨在确保TheProp实际调用; 它适用于一组特定的垃圾相关场景.