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

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

Wir'bauen eine Web-API, die's programmatisch aus einer C#-Klasse generiert. Die Klasse hat die Methode GetFooBar(int a, int b) und die API hat eine Methode GetFooBar, die Abfrageparameter wie &a=foo &b=bar annimmt.

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

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 genannte war die Art und Weise, wie ich Standardwerte mit C# 2.0 verwendet habe. Die Projekte, an denen ich jetzt arbeite, verwenden C# 4.0, das nun direkt optionale Parameter 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
}
Kommentare (2)

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. Das Ziel ist es, Parameter als optional zu kennzeichnen, ohne auf Tricks wie "optional" im Parameternamen zurückgreifen zu müssen.

Kommentare (4)

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 die Methode "int b", da sie die gleiche Signatur wie die Methode "int a" haben würde.

Sie könnten Nullable Typen verwenden...

"pre"; 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 'params' Parameters.

GetFooBar(params object[] args)

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

Kommentare (0)