2016-04-25 10 views
1

Ich war nur neugierig, was eine Best Practices-Lösung würde meine aktuelle Situation gegeben werden. Ich habe eine Datenbank, die Farben in ARGB Integer-Form speichert, aber ich erlaube es Nullwerte zu geben, da manchmal die Farbe nicht angegeben werden muss. Mit dem Entity Framework habe ich eine generierte Klasse mit einer ColorArgb-Eigenschaft für den Zugriff auf die Spalte, die erwartungsgemäß int zurückgibt. Ich habe auch eine andere Eigenschaft, Color, hinzugefügt, die ein System.Drawing.Color -Objekt zurückgibt. Die Color-Eigenschaft ist eigentlich nur ein Übergang, damit ich mit der generierten Klasse auf natürlichere Weise interagieren kann. Die Einstellung ist so einfach wie:Best Practices für die Rückgabe einer Color.FromArgb, wenn ein int gegeben wird, das null sein kann C#

ColorArgb = value.ToArgb(); 

Allerdings ist das Erhalten ein wenig interessanter. Hier ist, was ich bisher:

return ColorArgb == null ? Color.Empty : Color.FromArgb(ColorArgb ?? 0); 

Wie Sie sehen können, möchte ich die Idee behaupten, dass eine Farbe für diese Klasse nicht notwendig ist, so kehre ich Color.Empty, wenn der zugrunde liegende ARGB-Wert null ist, aber Die rechte Seite des Nullkoaleszenzoperators wird niemals erreicht. Ich habe garantiert, dass der Wert nicht null ist, aber ich weiß nicht, wie ich den Compiler in einer Best Practices-Form explizit sage. Kein ernstes Problem, aber ich würde gerne lernen. Daher wird jede Hilfe sehr geschätzt.

Edit: ColorArgb ist vom Typ System.Nullable<int>

+1

Ist 'ColorArgb' vom Typ' int? '? – ZoolWay

Antwort

0

Sie müssen die Null Koaleszierstruktur Operator nicht verwenden, wenn Sie wissen, dass der Wert nicht null ist. Statt ColorArgb.Value verwenden:

return ColorArgb == null ? Color.Empty : Color.FromArgb(ColorArgb.Value); 
+0

Einfach. Perfekt. Tausend Dank. Wird als Antwort so bald wie möglich markieren. –

+2

Eigentlich, wenn Sie die Überprüfung optimieren möchten, wenn der Wert Null ist, sollten Sie 'ColorArgb.GetValueOrDefault()' verwenden, da 'ColorArgb.Value' erneut überprüft, ob es intern null ist, aber' GetValueOrDefault' gibt einfach das zurück internes Feld direkt. Ich bezweifle, dass dies sogar messbar anders sein wird. –

2

Mehr sauberer Ansatz so sein könnte, wenn Sie schwarze Farbe für Null Integer-Wert benötigen.

Andernfalls, um die Nullwert-Ganzzahl zu prüfen, sollten Sie die .HasValue-Eigenschaft anstelle des Null-Vergleichs überprüfen.

return ColorArgb.HasValue ? Color.FromArgb(ColorArgb.Value) : Color.Empty; 
+1

Vielen Dank für Ihre Antwort! Ich habe graben und herausgefunden, dass der Null-Vergleich in einen Aufruf von '.HasValue' kompiliert wird. Schätze immer noch die andere Perspektive. –