2010-08-06 17 views
12

Verwendung von I Vorteil optionale Parameter in .Net nehmen bin ab 4.0einen optionalen Parameter des Typs System.Drawing.Color

Das Problem, das ich habe, ist, wenn ich versuche, einen optionalen Parameter von System.Drawing zu erklären. Farbe:

public myObject(int foo, string bar, Color rgb = Color.Transparent) 
{ 
    // .... 
} 

Ich möchte Color.Transparent den Standardwert für den RGB-Parameter sein. Das Problem ist, ich halte diesen Compiler-Fehler bekommen:

Default parameter value for 'rgb' must be a compile-time constant

Es tötet meinen Plan wirklich, wenn ich nur primitive Typen für optionale params verwenden kann.

+0

möglich Duplikat von [C# 4.0: Kann ich eine TimeSpan als optionalen Parameter mit einem Standardwert verwenden?] (Http://stackoverflow.com/questions/2168798/c-sharp-4- 0-can-i-use-a-timespan-als-optionaler-Parameter-with-a-default-Wert) – nawfal

Antwort

20

Nullable Werttypen in Situationen wie dieser zu helfen, verwendet werden kann.

public class MyObject 
{ 
    public Color Rgb { get; private set; } 

    public MyObject(int foo, string bar, Color? rgb = null) 
    { 
     this.Rgb = rgb ?? Color.Transparent; 
     // .... 
    } 
} 

BTW, der Grund, warum dies erforderlich ist, da der Standardwert beim Aufruf Punkt während der Kompilierung aufgefüllt wird und static readonly Werte werden erst zur Laufzeit festgelegt. (Durch den Typ Initialisierer)

+0

Ich habe dies ohne Visual Studio getan, so dass es einige kleinere Verbesserungen benötigen kann. –

+0

Das wird nicht funktionieren, Farbe ist nicht nullfähig. –

+0

@Neil N, das Fragezeichen nach dem Typnamen 'Farbe' macht diese Struktur zu einer 'Nullable '. –

3

Ich bin kein großer Fan von optionalen Parametern für solche Fälle überhaupt. IMO der beste Anwendungsfall für optionale Parameter ist Interop mit COM, wo optionale Parameter ziemlich oft verwendet werden. Situationen wie diese sind einer der Gründe, warum optionale Parameter es erst ab 4.0 in die Sprache geschafft haben.

Statt einen optionalen Parameter zu erstellen, überlasten die Funktion wie folgt:

public myObject(int foo, string bar) : this (foo, bar, Color.Transparent) {}; 

public myObject(int foo, string bar, Color RGB) { 
... 
} 
+0

das ist eigentlich, was ich vorher hatte, aber in meinem Fall, weil es so viele Überladungen des Konstruktors gibt Es macht einfach mehr Sinn, eine Handvoll optionaler Parameter zu haben und einen Konstruktor zu behalten. –

+0

Ich würde argumentieren, dass es nicht, und ein gutes Gegenbeispiel ist das Problem, in das Sie jetzt gerade laufen. Es gibt eine ganze Reihe von Funktionen rund um die Standard-.NET-Bibliotheken, die * ziemlich * eine Anzahl von Überladungen haben. Nehmen Sie Convert.ToInt32() zum Beispiel ... Definieren mehrerer Überladungen gibt Ihnen auch die Möglichkeit, ihre Verwendung separat zu dokumentieren. Häufig sind bestimmte Kombinationen von optionalen Parametern sinnvoll, während andere dies nicht tun. Optionale Parameter geben Ihnen nicht die Möglichkeit, dies nur mit der Funktionssignatur selbst zu tun, während eine Überlastung (bis zu einem gewissen Grad) dies tut. –

+0

Abgesehen von dem Color-Parameter, den ich einfach durch einen int ersetzen könnte, haben mir optionale Parameter erlaubt, etwa 100 Zeilen redundanten Code zu entfernen. Es gibt viel weniger zu warten. –

Verwandte Themen