В WPF DependencyProperty вызывает много коробок / распаковок при использовании с типами значений? - PullRequest
8 голосов
/ 30 июля 2011

В WPF DependencyProperty вызывает много коробок / распаковок при использовании с типами значений? Или реализация как-то предотвратить это, а не типы значений box / unbox? Так как они это делают?

Я думаю, что типы значений являются основным вариантом использования DependencyPropertys.

Спасибо

    public double Price
    {
        get { return (double)GetValue(PriceProperty); }
        set { SetValue(PriceProperty, value); }
    }


    public static readonly DependencyProperty PriceProperty =
        DependencyProperty.Register("Price", typeof(double), typeof(Quote), new UIPropertyMetadata(0.0d));

Ответы [ 3 ]

9 голосов
/ 30 июля 2011

Краткий ответ - да.

Подчеркивающее хранилище для значений свойств зависимостей не имеет представления о типах значений и сохраняет все как объект, что приведет к упаковке.Сам фреймворк использует «хитрый трюк» для оптимизации хранения логических свойств с помощью вспомогательного класса BooleanBoxes, в котором значения true и false хранятся в виде объектов в штучной упаковке.

В общем, если у вас есть несколько пользовательских свойств, вам нечегобеспокоюсь о.Однако, если у вас сложная сцена, в которой тысячи пользовательских объектов зависимостей летают, вы можете подумать об оптимизации производительности упаковки / распаковки.

2 голосов
/ 31 июля 2011

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

Когда WPF читает или изменяет свойство зависимостей (привязка и анимация), он НЕ использует эти установщики и получатели. Таким образом, (не) бокс, который вы показываете в коде, не будет выполнен.

Эти сеттеры и геттеры, которые вы показываете, предназначены для нас, разработчиков.

1 голос
/ 30 июля 2011

Вероятно, он будет использовать бокс, но, поскольку он масштабируется пользователем, это не должно происходить в масштабе, который мог бы стать проблемой.

Обратите внимание, что довольно часто Конвертор тоже будет задействован.

...