590 Stimmen

Wie können Sie optionale Parameter in C# verwenden?

Nota: Diese Frage wurde zu einer Zeit gestellt, als C# noch keine optionalen Parameter unterstützte (d.h. vor C# 4).

Wir erstellen eine Web-API, die programmatisch aus einer C#-Klasse generiert wird. Die Klasse hat die Methode GetFooBar(int a, int b) und die API hat eine Methode GetFooBar mit Abfrageparametern wie &a=foo &b=bar .

Die Klassen müssen optionale Parameter unterstützen, was in der Sprache C# nicht unterstützt wird. Was ist der beste Ansatz?

1266voto

Alex from Jitbit Punkte 44084

Ich bin überrascht, dass niemand optionale C# 4.0-Parameter erwähnt hat, die auf diese Weise funktionieren:

public void SomeMethod(int a, int b = 0)
{
   //some code
}

Edit : Ich weiß, dass es zu dem Zeitpunkt, als die Frage gestellt wurde, C# 4.0 noch nicht gab. Aber diese Frage rangiert immer noch auf Platz 1 in Google für "C# optionale Argumente", so dass ich dachte - diese Antwort ist es wert, hier zu sein. Entschuldigung.

150voto

Tim Jarvis Punkte 17605

Eine weitere Möglichkeit ist die Verwendung des Schlüsselworts params

public void DoSomething(params object[] theObjects)
{
  foreach(object o in theObjects)
  {
    // Something with the Objects…
  }
}

Genannt wie...

DoSomething(this, that, theOther);

81voto

stephenbayer Punkte 12054

In C# würde ich normalerweise mehrere Formen der Methode verwenden:

void GetFooBar(int a) { int defaultBValue;  GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
 // whatever here
}

UPDATE Das oben erwähnte war die Art und Weise, wie ich Standardwerte mit C# 2.0 erstellt habe. Die Projekte, an denen ich jetzt arbeite, verwenden C# 4.0, das jetzt optionale Parameter direkt unterstützt. Hier ist ein Beispiel, das ich gerade in meinem eigenen Code verwendet habe:

public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, 
                                   EDIVanInfo receiver, 
                                   EDIDocumentInfo info,
                                   EDIDocumentType type 
                                     = new EDIDocumentType(EDIDocTypes.X12_814),
                                   bool Production = false)
{
   // My code is here
}

61voto

Kalid Punkte 21328

Von dieser Website:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# erlaubt die Verwendung des [Optional]-Attributs (aus VB, jedoch nicht funktional in C#). Sie können also eine Methode wie diese haben:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

In unserem API-Wrapper erkennen wir optionale Parameter (ParameterInfo p.IsOptional) und setzen einen Standardwert. Ziel ist es, Parameter als optional zu kennzeichnen, ohne auf Tricks wie "optional" im Parameternamen zurückgreifen zu müssen.

35voto

Kepboy Punkte 3593

Sie könnten eine Methodenüberladung verwenden...

GetFooBar()
GetFooBar(int a)
GetFooBar(int a, int b)

Es hängt von den Methodensignaturen ab. In dem von mir angeführten Beispiel fehlt nur die Methode "int b", da sie die gleiche Signatur wie die Methode "int a" hätte.

Sie könnten nullbare Typen verwenden...

GetFooBar(int? a, int? b)

Sie könnten dann mit a.HasValue prüfen, ob ein Parameter gesetzt wurde.

Eine andere Möglichkeit wäre die Verwendung eines Parameters "params".

GetFooBar(params object\[\] args)

Wenn Sie mit benannten Parametern arbeiten wollten, müssten Sie einen Typ erstellen, um sie zu behandeln, obwohl ich glaube, dass es so etwas für Webanwendungen bereits gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X