1

所以在 .NET 中,我知道获取属性的值比获取字段的值更昂贵,前提是该属性在 getter 中有某种逻辑。我的问题有两个方面。考虑以下示例:

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

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

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

编译器是否优化此扩展以仅评估这三个方法调用一次(即内联它们的主体)?还是每次迭代都会调用三个方法?

我会被引导相信后者是真的。

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

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

4

1 回答 1

0

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

var value = StaticClass.PropertyA.PropertyB.PropertyC;
foreach (var item in collection)
    item.SomeProperty = value;
于 2013-05-23T18:57:10.870 回答