Насколько экономична система собственности WPF? - PullRequest
6 голосов
/ 05 апреля 2011

Говорят, что дизайнеры WPF сделали его экономичным или более производительным. Может кто-нибудь объяснить, например, что происходит под капотом, что делает систему свойств WPF более экономичной?

Ответы [ 4 ]

13 голосов
/ 05 апреля 2011

Вы, вероятно, ссылаетесь на тот факт, что свойства зависимости "дешевле", чем обычные свойства CLR.

В нескольких словах:

Свойства зависимости реализуются с использованием разреженных структур данных, которые выделяйте память только для значения свойства, если оно установлено для объекта .Напротив, стандартное значение свойства CLR хранится в виде поля внутри каждого объекта класса, в котором определено свойство , даже если для всех этих объектов для свойства установлено значение по умолчанию.

Так, например, если у нас есть 100 объектов со 100 свойствами CLR типа int каждый, то мы используем память 10000 int s, даже если все они имеют одинаковое значение по умолчанию (0).

Если бы это свойство было свойством зависимости, мы бы вообще не использовали никакой дополнительной памяти: WPF не нужно запоминать значение какого-либо свойства, поскольку он знает, что вы не изменили его по умолчанию.

Конечно, приведенное выше является довольно упрощенным объяснением и не охватывает всех преимуществ свойств зависимости по сравнению со свойствами CLR, но оно должно адекватно объяснить утверждение «DPs имеют более высокую производительность».

6 голосов
/ 05 апреля 2011

Большинство «свойств» элемента управления WPF фактически отсутствуют в самом элементе управления.Вместо того, чтобы добавлять десятки (в основном неиспользуемых) свойств к (базовым) классам, они решили добавить «мешок свойств» вместо словаря, содержащего только те свойства, которые фактически установлены.

В качестве бонуса учитываются внешние и внедренные свойства.

2 голосов
/ 05 апреля 2011

Система свойств зависимостей WPF хранит фактические значения свойств в оптимизированных структурах данных за кулисами.

Это имеет несколько преимуществ перед хранением значений свойств в виде полей:

  • Система свойств зависимостей, НЕ хранящая значения по умолчанию для свойств для каждого экземпляра объекта, может сэкономить часть памяти (в основном, если свойство имеет значение по умолчанию для целевого объекта, пространство не выделяется для значения. Это В отличие от наличия свойств с полями поддержки, где значения всегда хранятся, а память всегда зарезервирована для объекта).

  • Система свойств зависимостей может иметь оптимизированный механизм событий, позволяющий избежать хранения ссылок на обработчики для каждого объекта (например, используя резервные события на основе полей), это означает, что можно сэкономить больше места.

Конечно, для такой системы есть небольшие накладные расходы. Доступ к свойству не такой легкий, как при использовании обычного свойства, но команда WPF решила, что небольшие накладные расходы больше, чем восполняют из-за меньшего использования памяти.

0 голосов
/ 05 апреля 2011

В дополнение к другим ответам:

Свойства зависимостей в WPF поддерживают наследование значений свойств. При обычных свойствах CLR гораздо сложнее передать значения в любые «дочерние» объекты без изменения дочернего объекта. Очевидно, что это можно сделать с помощью прикрепленных методов и статического сопоставления, но, вероятно, это не будет очень общим решением. Хотя есть некоторые издержки с унаследованными свойствами, они довольно эффективны при передаче значений.

...