Ich Refactoring Code in einer alternden Windows-Anwendung, und ich bin auf ein Muster der Art, die ich bin mir nicht sicher, ich mag: Eine Klasse hat globale Farbe Variablen, wie folgt aus:Strategien für die Weitergabe von Farben (Vermeidung ref?)
private Color myForegroundColor = Color.Azure;
private Color myBackgroundColor = Color.Empty;
// ...etc.
Es gibt eine Reihe von ihnen, und sie durch ref werden bestimmte Teile der Benutzeroberfläche Methoden übergeben um die Verantwortung für die Einrichtung.
Ich nehme an, dass eine Color
ist eine Struktur, und dass jede Farbe wird daher durch ref übergeben, um zu vermeiden, neue Kopien davon jedes Mal, wenn eine Methode aufgerufen wird. IE so etwas wie:
// Avoid creating a copy of myForgroundColor inside SetUpButton():
MyHelperClass.SetUpButton(ref myForegroundColor);
Ich kann das Gefühl nicht los, dass diese Nutzung von ref
in dieser Klasse und verwandte Klassen schlecht ist. Es fühlt sich an wie ein "code smell", obwohl ich nicht wirklich sagen kann warum.
Ich habe ein paar Beiträge zu ähnlichen Problemen gesehen, mit Empfehlungen wie "verwenden Sie eine Klasse mit Farben, die dann als Werttyp übergeben wird", aber es ist nicht ganz klar, wie es am besten wäre mach das.
Was würde ich tun möchte, ist etwas ähnliches erstellen, um die folgenden:
public class ColorContainer
{
public UiSettingsContainer()
{
MyColor = Color.Black;
MyNextColor = Color.Blue;
// ..etc...
}
public Color MyColor { get; private set; }
// ...etc....
}
Das würde mir die Kontrolle über die Farben behalten lassen, aber die Auswirkungen auf das Gedächtnis sind ein wenig zu mir unklar; Wenn ich eine Instanz dieser Klasse erstellt und diese an die Methoden weitergegeben habe, die Informationen über die enthaltenen Farben benötigen, würde nicht eine Kopie einer color
(mit einer Struktur) erstellt werden, sobald eine Implementierungsmethode davon Gebrauch macht?
Bin ich in der Annahme richtig, dass dieser Code eine neue Kopie erstellen würde, und damit weniger effektiv ...
// Assumption: This creates a new copy of color in memory.
public void SetSomeColor(Color col){
someComponent.color = col;
}
// Calling it:
SetSomeColor(myColorContainerInstance.MyColor);
... als dieser Code, der nur Nutzung der bestehenden Struktur machen würde? :
// Question: Does this avoid creating a new copy of MyColor in memory?
public void SetSomeColor(ColorContainer container){
someComponent.color = container.MyColor;
}
// Calling it:
SetSomeColor(myColorContainerInstance);
ich ähnlich die folgenden zu einer Lösung, die derzeit bin Neigung, in denen ich die Farben in einer separaten Klasse sammeln und dem Code ein wenig, neu zu organisieren, aber unter Verwendung ref
halten. In diesem Fall wird jedoch MyColor
ein öffentliches Feld in ColorContainer
, sein müssen, was bedeutet, dass ich weniger Kontrolle darüber, wer es ist Wert einstellen:
// Assumption: This creates a new copy of color in memory.
public void SetSomeColor(ref Color col){
someComponent.color = col;
}
// Calling it:
SetSomeColor(ref myColorContainerInstance.MyColor);
Ist dies eine gute Lösung, oder gibt es bessere Strategien Ressourcen wie diese zu behandeln?
Kannst du diese Benutzereinstellung nicht einfach zu einem statischen/globalen Typ machen? –
Warum sollten Sie das Kopieren von 'Color' Objekten vermeiden? – delnan
Wenn 'SetSomeColor' nicht als' virtual' gekennzeichnet ist, besteht eine sehr gute Chance, dass das JIT die Methode trotzdem inlining, was verhindert, dass die Struktur kopiert wird, auch wenn das Argument nicht mit 'ref' gekennzeichnet ist. –