C# “确保语句未优化”;“离开”;
不幸的是,我使用的API调用get属性访问器会产生副作用。我如何确保:C# “确保语句未优化”;“离开”;,c#,.net,properties,C#,.net,Properties,不幸的是,我使用的API调用get属性访问器会产生副作用。我如何确保: public void Foo() { var x = obj.TheProp; // is it guarnateed to be accessed? } 编译器没有优化掉吗?不会优化掉-getter是一个方法,将被调用,尽管JIT可能会选择“内联”很多它,如果它很简单,也许最终(完全是理论上的)会这样做如果该程序没有做任何特别令人兴奋的事情,则只需执行空引用检查。可能发生的情况是,“返回的东西”(代码存储到x)在方
public void Foo()
{
var x = obj.TheProp; // is it guarnateed to be accessed?
}
编译器没有优化掉吗?不会优化掉-getter是一个方法,将被调用,尽管JIT可能会选择“内联”很多它,如果它很简单,也许最终(完全是理论上的)会这样做如果该程序没有做任何特别令人兴奋的事情,则只需执行空引用检查。可能发生的情况是,“返回的东西”(代码存储到
x
)在方法结束前有资格进行垃圾收集;这很少是一个问题,除了进程外互斥;在这种情况下,您可以执行以下操作:
var x = obj.TheProp;
// long-running code here
GC.KeepAlive(x);
但是,请注意,如果x
是值类型,这将强制将其装箱,这并不理想
但重点是:上面的内容并不是为了确保实际调用了
程序
;它适用于一组特定的垃圾相关场景。我认为编译器将属性视为方法调用,因此它不能“消失”,但不能100%确定;通常,当人们想要这样做时,是因为吸气剂有一些微妙的副作用;在我看来,显式地将其作为一个方法要清楚得多,然后您也可以编写:obj.GetTheProp()代码>(只需选择忽略返回值)。但在我看来,这对打电话的人来说更清楚,副作用是可以预料的。