Πώς μπορείτε να χρησιμοποιήσετε προαιρετικές παραμέτρους στη C#;

Σημείωση: Αυτή η ερώτηση τέθηκε σε μια εποχή που η C# δεν υποστήριζε ακόμη προαιρετικές παραμέτρους (δηλαδή πριν από τη C# 4).</sup&gt,

Κατασκευάζουμε ένα web API που δημιουργείται προγραμματιστικά από μια κλάση C#. Η κλάση έχει τη μέθοδο GetFooBar(int a, int b) και το API έχει μια μέθοδο GetFooBar που δέχεται παραμέτρους ερωτήματος όπως &a=foo &b=bar.

Οι κλάσεις πρέπει να υποστηρίζουν προαιρετικές παραμέτρους, κάτι που δεν υποστηρίζεται στη γλώσσα C#. Ποια είναι η καλύτερη προσέγγιση;

Στη C#, κανονικά θα χρησιμοποιούσα πολλαπλές μορφές της μεθόδου:

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

ΑΝΑΘΕΩΡΗΣΗ: Αυτό που αναφέρθηκε παραπάνω ήταν ο τρόπος με τον οποίο έκανα τις προεπιλεγμένες τιμές με την C# 2.0. Τα έργα στα οποία εργάζομαι τώρα χρησιμοποιούν την C# 4.0 η οποία υποστηρίζει πλέον άμεσα προαιρετικές παραμέτρους. Εδώ είναι ένα παράδειγμα που μόλις χρησιμοποίησα στον δικό μου κώδικα:

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

Από αυτόν τον ιστότοπο:

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

Η C# επιτρέπει τη χρήση του χαρακτηριστικού [Optional] (από τη VB, αν και δεν είναι λειτουργικό στη C#). Έτσι μπορείτε να έχετε μια μέθοδο όπως αυτή:

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

Στο δικό μας API wrapper, ανιχνεύουμε προαιρετικές παραμέτρους (ParameterInfo p.IsOptional) και ορίζουμε μια προεπιλεγμένη τιμή. Ο στόχος είναι να επισημάνουμε τις παραμέτρους ως προαιρετικές χωρίς να καταφεύγουμε σε αδέξιους τρόπους όπως το να έχουμε το "optional" στο όνομα της παραμέτρου.

Σχόλια (4)

Θα μπορούσατε να χρησιμοποιήσετε την υπερφόρτωση μεθόδων...

Σχόλια (0)