C#编译器是否将嵌套属性调用优化为内联调用?

时间:2013-05-23 15:38:02

标签: .net optimization properties

因此在.NET中我知道获取属性的值比使用字段的值更昂贵,前提是该属性在getter中具有某种逻辑。我的问题有两点。请考虑以下示例:

foreach(var item in collection)
{
    item.SomeField = StaticClass.PropertyA.PropertyB.PropertyC;
}

所以(希望显然)StaticClass是一个静态类,右边的所有属性都是某个类的实例。此外,所有属性都是纯粹的字段包装器,因此PropertyA具有仅返回字段的getter和分配给所述字段的setter,依此类推。

通过逐步执行此操作可以看出,为了检索该值,必须进行三次方法调用(get_PropertyA()get_PropertyB()get_PropertyC())。我的第一个问题是:

编译器是否优化此扩展以仅评估这三个方法调用(即内联其体)?或者它会为每次迭代进行三次方法调用吗?

我会相信后者是真的。

此外,我们假设在整个应用程序中使用了这段特殊代码。如果后者是真的,那么通过在进入局部变量的循环之前存储PropertyC的值并在循环中使用该局部变量来尝试优化方法本身是否有意义?

提前致谢。这个问题确实倾向于讨论,但我相信有一个明确的答案。

1 个答案:

答案 0 :(得分:0)

.NET内存模型要求对循环的每次迭代计算一次操作。如果您知道StaticClass.PropertyA.PropertyB.PropertyC的结果是一个常量值(或者至少通过该循环不变),则应该在循环外声明一个字段以保存其值。

var value = StaticClass.PropertyA.PropertyB.PropertyC;
foreach (var item in collection)
    item.SomeProperty = value;