Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “确保语句未优化”;“离开”;_C#_.net_Properties - Fatal编程技术网

C# “确保语句未优化”;“离开”;

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)在方

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

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()(只需选择忽略返回值)。但在我看来,这对打电话的人来说更清楚,副作用是可以预料的。