Поделиться через


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

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

В этом разделе содержатся следующие подразделы.

  • Доступ и безопасность свойств оболочек и свойств зависимости
  • Предоставление системы свойств свойства зависимости
  • Связанные разделы

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

Как правило, свойства зависимости реализуются вместе со свойствами «оболочки» common language runtime (CLR), которые упрощают получение или присвоение значения для свойства из экземпляра. Но на самом деле оболочки — это всего лишь удобные методы, реализующие внутренние статические вызовы GetValue и SetValue, которые используются при взаимодействии со свойствами зависимости. С другой стороны, свойства предоставляются как свойства common language runtime (CLR), обеспечение которых осуществляется с помощью свойства зависимости, а не закрытого поля. Механизмы безопасности, применяемые к оболочкам, не распараллеливают поведение системы свойств и доступ к основному свойству зависимости. Помещение требования безопасности в программу-оболочку только предотвратит использование подходящего метода, но не предотвратит вызов метода GetValue или SetValue. Аналогично, предоставление защищенного или закрытого уровня доступа к оболочке не обеспечит эффективной защиты.

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

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

ПримечаниеПримечание

Объявление поля идентификатора DependencyProperty как закрытого не запрещено, и он может быть использован для уменьшения немедленного предоставления пространства имен настраиваемого класса, но такое свойство не следует рассматривать как «закрытое» в том же смысле, что и уровень доступа в определениях языка common language runtime (CLR) (основания см. в следующем разделе).

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

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

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

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

См. также

Основные понятия

Пользовательские свойства зависимостей