Kürzlich bin ich auf eine .NET-Farbkarte gestoßen, die auf ihrem Farbton- und Helligkeitswert basiert. Was mich streichelt, ist das verrückte Graustufen-Diagramm. Zum Beispiel ist DarkGray tatsächlich heller als Gray? Auch kann ich keine Logik in der Gradation der rgb-Werte sehen, es geht von 0 bis 105 zu 128?
%Vor%
Was ich will, ist eine GrayScaleBrushes-Klasse, die sich genau wie die Brushes-Klasse verhält, aber mit meinem benutzerdefinierten Schema wie:
%Vor%Wie man das macht, sicherzustellen, dass die Bürsten richtig entsorgen?
Bearbeiten: Die .NET Brushes-Klasse sieht wie folgt aus (mit Reflektor zerlegt).
%Vor%SafeNativeMethods scheint mir unerreichbar. Angenommen, ich habe gerade einen SolidBrush in einer statischen Methode zurückgegeben, würde das alles korrekt entsorgen? (Und wie das zu testen?)
%Vor% Das SafeNativeMethods
ist in diesem Fall nur ein einfacher Cache, der eine Kopie des Pinsels enthält. Ein zweiter Aufruf des Property-Getter erstellt keine neue Instanz. Stattdessen wird immer derselbe Pinsel zurückgegeben.
Um dies zu erreichen, könnten Sie Ihre Funktion vielleicht folgendermaßen umschreiben:
%Vor% Diese Lösung erstellt die Graustufen nach Bedarf, aber durch die Kosten, die bei jedem Aufruf auf null
geprüft werden. Sie können dieses Geschwindigkeitsproblem erreichen, indem Sie erneut ein Speicherproblem ändern, indem Sie einen ähnlichen Ansatz wählen:
Aber ich denke in diesem Fall ist es nur eine Frage des Geschmacks, denn weder die Geschwindigkeit noch die Erinnerung werden in beiden Fällen ein echtes Problem sein.
Die Brushes
-Klasse ist statisch und kann nur eine kleine Anzahl von Ressourcen ausgeben, die der Anzahl der definierten Farben entspricht. Lassen Sie diese Ressourcen also beim Beenden der Anwendung bereinigen. Sorgen Sie stattdessen dafür, dass Ihre Pinsel nicht wirklich erstellt werden, es sei denn, sie sind referenziert. Das wird den Start beschleunigen und sicherstellen, dass unbenutzte Farben keine Ressourcen verbrauchen.
Ich würde Folgendes empfehlen:
Erstellen Sie eine statische Klasse GrayScaleBrushes
Erstellen Sie ein statisches Dictionary mit dem Intensitätsprozentsatz (int) als Schlüssel,
Erstellen Sie eine einzelne statische indizierte Eigenschaft 'Pct', die Sie wie GrayScaleBrushes.Pct [10] verwenden würden, die den Wörterbucheintrag zurückgeben würde.
Nun können Sie entweder tun, was Oliver gesagt hat, und die Wörterverzeichniseinträge spontan erstellen, oder Sie können einen statischen Konstruktor verwenden, um die 20 Einträge zu durchlaufen und sie dem Wörterbuch hinzuzufügen.
Diese Methode erspart Ihnen das Erstellen und Verwalten der 20 ungeraden Eigenschaften. Prost.