Я постоянно смотрю примеры в Интернете, где в методе есть свойство элемента, которое перед использованием копируется в локальную переменную. Например, что-то вроде этого (из StackPanel
исходного кода Microsoft):
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);
Наконец, если это сделано по той же причине, по которой мы могли бы кэшировать результат длительного метода, то как мы должны знать, к каким свойствам нужно обращаться таким образом?