2009-07-30 4 views
1

Ich habe eine Methode, die eine Reihe von optionalen Parametern akzeptiert und ich überbelaste die Methode, um die verschiedenen Kombinationen von Signaturen zu liefern. Intellisense erscheint mit einer Reihe von verschiedenen Signaturen, aber ich denke, es sieht jetzt ziemlich verwirrend aus, da es verschiedene Kombinationen gibt, die ich bereitstellen muss, nicht nur Parameter am Ende der Methodensignatur aufzubauen.Optionale Parameter

Sollte ich meine Methode einfach nicht überladen und auf eine Signatur beschränken, damit der Benutzer meiner Methode Nullen übergeben muss? Es würde die Signatur klarer machen, aber den Rufcode unordentlicher erscheinen lassen.

Antwort

8

Sind Sie auf C# 1-3 beschränkt? C# 4 unterstützt optionale Parameter und benannte Argumente ...

Bis dahin sollten Sie wahrscheinlich entweder Stick mit Überlastung oder eine eigene Klasse mit wandelbaren Eigenschaften erstellen, zum Beispiel

FooOptions options = new FooOptions { Name="Jon", Location="Reading" }; 
Foo foo = new Foo(options); 

Das ist alles in einer Aussage gemacht werden kann, wenn Sie wollen ... und wenn einige der Eigenschaften obligatorisch sind, dann einen einzigen Konstruktor in FooOptions schaffen, die alle von ihnen nimmt.

In C# 4 Sie würde schreiben können:

Foo foo = new Foo(name: "Jon", location: "Reading"); 

wenn der Konstruktor als

geschrieben wurde
public Foo(string name, 
      int age = 0, 
      string location = null, 
      string profession = null) 

Benannte Argumente und optionale Parameter sollte es viel einfacher zu unveränderlichen Typen zu konstruieren mit optionalen Eigenschaften in C# 4 :)

+0

Ja, auf C# 2 Ich habe Angst, muss auf C# 4 und optionale Parameter warten. – Charlie

+0

Ja, das wird wirklich praktisch – SwDevMan81

0

Denken Sie über params Argument der C# -Methode.

void test(params object []arg) { 
    .. 
} 
+4

Fast sicher der falsche Ansatz: Sie verlieren Typ Sicherheit, es sei denn, alle Ihre Parameter sind vom gleichen Typ, und Sie verlieren jeden Hinweis, welcher Parameter was bedeutet. –

+0

Dies wird Sie verlieren Typ Sicherheit und erfordert Boxen von Werttypen. Beide sind normalerweise nicht wünschenswert. –

0

Sie die params keyword Definitionen nur in der Länge variieren (und nicht um, sonst dies wird nicht der beste Ansatz) .Dann in der Funktion, die Sie Setup Sie können die Werte, wenn die Funktion verwenden können müssen auf der Parametereingabe basierend

+0

Ich würde 'params' nur betrachten, wenn die Argumente vom selben Typ sind. Siehe auch Jons Kommentar zu einer anderen Antwort. –

+0

Ja, das ist eine Art von dem, was ich erwähnte, dass nur, wenn die Art der Bestellung die gleiche ist, das wirklich funktionieren würde. Sonst ist Jons Antworten der Weg zu gehen – SwDevMan81

+0

Das wird in meinem Fall nicht funktionieren, weil ich eine feste Signatur brauche. Es wäre in Ordnung, wenn ich einige Daten, die ich in Form eines Arrays wie Zeichenfolge benötigt, übergeben würde – Charlie