Sicherheit von Abhängigkeitseigenschaften
Abhängigkeitseigenschaften sollten im Allgemeinen als öffentliche Eigenschaften betrachtet werden. Das Wesen des Windows Presentation Foundation (WPF)-Eigenschaftensystems verhindert die Möglichkeit, Sicherheitsgarantien in Bezug auf einen Abhängigkeitseigenschaftswert abzugeben.
Zugriff und Sicherheit von Wrappern und Abhängigkeitseigenschaften
Abhängigkeitseigenschaften werden in der Regel zusammen mit Common Language Runtime (CLR)-Wrappereigenschaften implementiert, die das Abrufen oder Festlegen der Eigenschaft aus einer Instanz vereinfachen. Aber die Wrapper sind eigentlich nur bequeme Methoden, die die zugrunde liegenden statischen GetValue- und SetValue-Aufrufe implementieren, die bei der Interaktion mit Abhängigkeitseigenschaften verwendet werden. Anders formuliert werden die Eigenschaften als Common Language Runtime (CLR)-Eigenschaften verfügbar gemacht, die durch eine Abhängigkeitseigenschaft anstatt durch ein privates Feld gesichert werden. Auf Wrapper angewendete Sicherheitsmechanismen gelten nicht parallel zum Verhalten des Eigenschaftensystems und zum Zugriff auf die zugrunde liegende Abhängigkeitseigenschaft. Eine Sicherheitsanforderung an den Wrapper verhindert nur die Verwendung der bequemen Methode, nicht aber die Aufrufe von GetValue oder SetValue. Auch bietet das Versehen der Wrapper mit geschützten oder privaten Zugriffsebenen keine effektive Sicherheit.
Beim Schreiben von eigenen Abhängigkeitseigenschaften sollten Sie die Wrapper und das DependencyProperty-Bezeichnerfeld als öffentliche Member deklarieren, damit Aufrufer keine irreführenden Informationen über die wahre Zugriffsebene dieser Eigenschaft erhalten (da der Speicher als eine Abhängigkeitseigenschaft implementiert ist).
Für eine benutzerdefinierte Abhängigkeitseigenschaft können Sie die Eigenschaft als schreibgeschützte Abhängigkeitseigenschaft registrieren. Dies ist eine effektive Möglichkeit, um das Festlegen der Eigenschaft durch Benutzer ohne Verweis auf den DependencyPropertyKey für diese Eigenschaft zu verhindern. Weitere Informationen finden Sie unter Schreibgeschützte Abhängigkeitseigenschaften.
Hinweis
Das Deklarieren eines DependencyProperty-Bezeichnerfelds als privat ist zwar zulässig, und könnte beispielsweise verwendet werden, den sofort offengelegten Namespace einer benutzerdefinierten Klasse zu reduzieren. Doch sollte eine solche Eigenschaft nicht in dem Sinn als privat verstanden werden, wie diese Zugriffsebene in den Common Language Runtime (CLR)-Sprachdefinitionen definiert wird. Im nächsten Abschnitt werden die Gründe dafür näher beschrieben.
Offenlegen des Eigenschaftensystems von Abhängigkeitseigenschaften
Es ist in der Regel nicht hilfreich und kann sogar irreführend sein, eine DependencyProperty als etwas anderes als eine öffentliche Zugriffsebene zu deklarieren. Diese Zugriffsebeneneinstellung verhindert lediglich, dass jemand einen Verweis auf die Instanz aus der deklarierenden Klasse erhält. Es gibt jedoch mehrere Aspekte des Eigenschaftensystems, die ein DependencyProperty als Mittel zur Identifizierung einer bestimmten Eigenschaft zurückgeben, da diese auf der Instanz einer Klasse oder einer abgeleiteten Klasseninstanz vorhanden ist. Dieser Bezeichner kann auch dann für einen SetValue-Aufruf verwendet werden, wenn der ursprüngliche statische Bezeichner als nicht öffentlich deklariert wird. Außerdem erhalten virtuelle OnPropertyChanged-Methoden Informationen über jede vorhandene Abhängigkeitseigenschaft, deren Wert sich geändert hat. Darüber hinaus gibt die GetLocalValueEnumerator-Methode Bezeichner für jede Eigenschaft von Instanzen mit einem lokal festgelegten Wert zurück.
Validierung und Sicherheit
Es stellt keinen geeigneten Sicherheitsmechanismus dar, eine Forderung auf einen ValidateValueCallback anzuwenden und zu erwarten, dass ein Fehler bei der Überprüfung eines Forderungsfehlers verhindert, dass eine Eigenschaft festgelegt wird. Die durch ValidateValueCallback erzwungene Ungültigkeit von festgelegten Werten kann auch von böswilligen Aufrufern unterdrückt werden, wenn diese Aufrufer innerhalb der Anwendungsdomäne agieren.
Weitere Informationen
.NET Desktop feedback