Ich habe das in folgendem Link gelesen: -
Da GetValue und SetValue jedoch intern ein effizientes Sparse-Speichersystem verwenden und IsDefaultProperty ein statisches Feld (und nicht ein Instanzfeld) ist, speichert die Implementierung der Abhängigkeitseigenschaft den Speicher pro Instanz im Vergleich zu einer typischen .NET-Eigenschaft. Wenn alle Eigenschaften von WPF-Steuerelementen Wrapper um Instanzfelder wären (wie die meisten .NET-Eigenschaften), würden sie aufgrund der allen Instanzen zugeordneten lokalen Daten eine erhebliche Menge an Speicher belegen.
Aber irgendwann werden sie irgendwo gespeichert, wie spart es Speicherverbrauch?
Siehe folgenden Link: Ссылка
Was von einem Objekt als Abhängigkeitseigenschaft deklariert wird, ist tatsächlich nichts mehr als ein Identifikator. Diese statische "Eigenschaft" ist wirklich ein Schlüssel, der ein Objekt einer bestimmten Speicher-ID zuordnet. Zum Beispiele für grafische Objekte haben eine Hintergrundeigenschaft, die festgelegt werden kann explizit oder durch die Verwendung von Vorlagen oder Stilen.
Solange eine Abhängigkeitseigenschaft ihren Standardzustand verwendet (was sehr gebräuchlich ist), nimmt sie keinen zusätzlichen Speicher auf, da der Standardwert verwendet wird. Der Standardwert wird nicht pro Instanz gespeichert, er wird pro Abhängigkeitseigenschaft gespeichert und wird durch Metadaten festgelegt.
Beispiel, beachten Sie, wie Brushes.Black
als Standardwert festgelegt ist
Überlege es dir so: Angenommen du hast vier TextBlocks
in Xaml
Die drei TextBlocks
oben haben Foreground
auf Schwarz gesetzt, obwohl Sie sie nie explizit auf Schwarz gesetzt haben. Sie verwenden ihren Standardwert. Also für die Eigenschaft Foreground
für die obigen drei TextBlocks
benötigen Sie nur ein Feld (da es ein statisches Feld ist).
Für das vierte TextBlock
haben Sie jedoch Foreground
explizit auf Grün gesetzt, so dass der Wert als lokaler Wert für Foreground
in dieser Instanz in ein Dictionary eingefügt wird und somit zusätzlichen Speicher erfordert (auch , wird es an der Stelle Nummer 3 in der folgenden Liste enden, wobei Setters
, Triggers
etc) überschrieben werden. .
Siehe auch den folgenden Beitrag von Josh Smith, der eine gute Lektüre enthält: Entmystifizierung von Abhängigkeitseigenschaften
Es gibt einen wohldefinierten Regelsatz, der intern von WPF verwendet wird um herauszufinden, was der wahre Wert eines DP ist. Hier ist eine kurze Zusammenfassung der Präzedenzregeln, die beim Auflösen des Wertes eines DP verwendet werden (lesen mehr dazu hier ):
- Nötigung des Immobiliensystems
- Aktive Animationen oder Animationen mit einem Halteverhalten
- Lokaler Wert
- Vorlagenvorlage
- Stil-Trigger
- Vorlagenauslöser
- Stilsetzer
- Themenstil
- Vererbung
- Standardwert aus Abhängigkeitseigenschaftsmetadaten
Bearbeiten: Um den Kommentar von Duane zu beantworten
Wenn Sie den Wert explizit auf den gleichen Wert wie den Standardwert setzen, wird er trotzdem als lokaler Wert gespeichert. Dies kann leicht mit dem folgenden Xaml verifiziert werden.
Bei% TextBlocks
wird Foreground
auf Schwarz gesetzt, bei der letzteren wird jedoch ein lokaler Wert festgelegt. Der Style
kann Foreground
nur für den ersten TextBlock
und nicht den späteren% setzen, da Style-Setter eine niedrigere Priorität als der lokale Wert haben.
Angenommen, Sie erstellen eine Klasse mit einem Dutzend Eigenschaften. Erstelle 100.000 von ihnen. Wie viele Objektreferenzen haben Sie jetzt? 1.200.000.
Implementieren Sie jetzt eine Klasse namens DependencyObject
:
Erstellen Sie eine abgeleitete Klasse wie folgt:
%Vor% Erstelle nun 100.000 Instanzen von MyDependencyObject
und setze ihre Parent
. Wie viele Objektreferenzen werden verwendet (ohne das übergeordnete Element)? 300.000.
So funktioniert die Vererbung von Eigenschaftswerten in Abhängigkeitsobjekten.
Tags und Links wpf dependency-properties