因此在.NET中我知道获取属性的值比使用字段的值更昂贵,前提是该属性在getter中具有某种逻辑。我的问题有两点。请考虑以下示例:
foreach(var item in collection)
{
item.SomeField = StaticClass.PropertyA.PropertyB.PropertyC;
}
所以(希望显然)StaticClass
是一个静态类,右边的所有属性都是某个类的实例。此外,所有属性都是纯粹的字段包装器,因此PropertyA
具有仅返回字段的getter和分配给所述字段的setter,依此类推。
通过逐步执行此操作可以看出,为了检索该值,必须进行三次方法调用(get_PropertyA()
,get_PropertyB()
,get_PropertyC()
)。我的第一个问题是:
编译器是否优化此扩展以仅评估这三个方法调用(即内联其体)?或者它会为每次迭代进行三次方法调用吗?
我会相信后者是真的。
此外,我们假设在整个应用程序中使用了这段特殊代码。如果后者是真的,那么通过在进入局部变量的循环之前存储PropertyC
的值并在循环中使用该局部变量来尝试优化方法本身是否有意义?
提前致谢。这个问题确实倾向于讨论,但我相信有一个明确的答案。
答案 0 :(得分:0)
.NET内存模型要求对循环的每次迭代计算一次操作。如果您知道StaticClass.PropertyA.PropertyB.PropertyC
的结果是一个常量值(或者至少通过该循环不变),则应该在循环外声明一个字段以保存其值。
var value = StaticClass.PropertyA.PropertyB.PropertyC;
foreach (var item in collection)
item.SomeProperty = value;