Безопасность свойства зависимости

Свойства зависимости, как правило, считаются открытыми. Суть системы свойств Windows Presentation Foundation (WPF) такова, что дать гарантии безопасности о значении свойства зависимости невозможно.

Доступ к программам-оболочкам и свойствам зависимости и их безопасность

Как правило, свойства зависимостей реализуются вместе со свойствами "оболочки" среды CLR, которые упрощают получение или установку свойства из экземпляра. Однако оболочки — это просто удобные методы, реализующие базовые GetValue и SetValue статические вызовы, которые используются при взаимодействии со свойствами зависимостей. С другой стороны, свойства предоставляются в виде свойств среды CLR, которые могут поддерживаться свойством зависимостей, а не закрытым полем. Механизмы безопасности, применяемые к программам-оболочкам, не поддерживают параллели между поведением системы свойств и доступом базового свойства зависимости. Помещение требования безопасности в оболочку будет препятствовать использованию удобного метода, но не предотвратит вызовы GetValue или SetValue . Аналогично: размещение защищенного или закрытого уровня доступа в программе-разработчике не обеспечивает эффективную защиту.

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

Для настраиваемого свойства зависимости можно зарегистрировать свойство как свойство зависимостей только для чтения, и это обеспечивает эффективное средство предотвращения установки свойства любым пользователем, который не хранит ссылку на DependencyPropertyKey свойство для этого свойства. Дополнительные сведения см. в разделе Свойства зависимостей "только для чтения".

Примечание

Объявление DependencyProperty поля идентификатора Private не запрещено, и его можно использовать для уменьшения немедленно предоставляемого пространства имен пользовательского класса, но такое свойство не должно рассматриваться как "Private" в том же смысле, что и определения языка среды CLR определяют этот уровень доступа, по причинам, описанным в следующем разделе.

Предоставление системы свойств свойствам зависимости

Как правило, он не полезен и является недостоверным, чтобы объявить DependencyProperty как любой уровень доступа, отличный от Public. Такая настройка уровня доступа просто лишит возможности получить ссылку на экземпляр из объявляющего класса. Но существует несколько аспектов системы свойств, которые будут возвращать в DependencyProperty качестве средства идентификации конкретного свойства в том виде, в каком оно существует в экземпляре класса или экземпляра производного класса, и этот идентификатор по-прежнему можно использовать в SetValue вызове, даже если исходный статический идентификатор объявлен как неоткрытый. Кроме того, OnPropertyChanged виртуальные методы получают сведения о любом существующем свойстве зависимости, которое изменило значение. Кроме того, GetLocalValueEnumerator метод возвращает идентификаторы для любого свойства в экземплярах с локально заданным значением.

Проверка и безопасность

Применение спроса к ValidateValueCallback и ожидаемого сбоя проверки при сбое требования, чтобы предотвратить установку свойства, не является адекватным механизмом безопасности. ValidateValueCallbackЕсли вызывающие объекты работают в домене приложения, они также могут подавляться с помощью недействительности Set-value.

См. также раздел