【发布时间】:2018-05-04 10:34:49
【问题描述】:
我一直在网上看到示例,其中方法中的元素属性在使用前被复制到局部变量中。例如,像这样的东西(来自微软的StackPanel 源代码):
UIElementCollection children = arrangeElement.InternalChildren;
...
for (int i = 0, count = children.Count; i < count; ++i)
{
UIElement child = (UIElement)children[i];
if (child == null) { continue; }
...
}
谁能向我解释这样做有什么好处(如果有的话),而不是像这样每次都直接访问该属性?:
for (int i = 0, count = arrangeElement.InternalChildren.Count; i < count; ++i)
{
UIElement child = (UIElement)arrangeElement.InternalChildren[i];
if (child == null) { continue; }
...
}
显然,它在屏幕上节省了一些字符,但这并不是这样做的理由。另外,我理解为什么我们可能希望使用长时间运行的方法来执行此操作,作为一种缓存形式:
double value = GetValueFromLongRunningMethod();
...
for (int i = 0; i < someCollection.Count; i++) DoSomethingWith(value);
但我看到很多都是用属性完成的,我想知道为什么。这是互联网上另一个常见的与虚拟化有关的示例:
IItemContainerGenerator generator = this.ItemContainerGenerator;
GeneratorPosition position = generator.GeneratorPositionFromIndex(firstVisibleItemIndex);
为什么这样做而不是这个?:
GeneratorPosition position =
this.ItemContainerGenerator.GeneratorPositionFromIndex(firstVisibleItemIndex);
最后,如果这样做的原因与我们可能缓存长时间运行的方法的结果相同,那么我们应该如何知道需要以这种方式访问哪些属性?
【问题讨论】:
-
可读性....
-
你说的是
online examples,所以答案是可读性。 -
如果该物业被调用昂贵怎么办?请记住,属性是方法...
-
更容易读、写,而且通常性能更好。 (这是一个小问题)
-
如果我错了,请纠正我,但考虑到一些没有相关成本的属性/字段链并且分配了局部变量并且从未修改过,因此它只是一个额外的参考,具有可读性作为唯一的好处,我认为编译器会优化它来抵消它的成本
标签: c# variables properties