Mai mult
Cum poți folosi parametri opționali in C#?
Notă: Această întrebare a fost întrebat la un moment dat când C# nu acceptă încă opțională de parametri (de exemplu, înainte de a C# 4).
Am're construirea unui web API care's programatic generate de un C# clasa. Clasa a metoda GetFooBar(int a, int b) și API-ul are o metoda
GetFooBara lua de interogare params ca
&o=foo &b=bar`.
Clasele trebuie să sprijine parametri opționali, care e't sprijinit în C# limbajul. Ce's cea mai bună abordare?
455
21
Sunt surprins că nimeni nu a menționat C# 4.0 opțional parametrii care funcționează ca aceasta:
Edit: știu că în momentul în care întrebarea a fost întrebat, C# 4.0 n't există. Dar această întrebare încă pe locul #1 in Google pentru "C# argumente opționale" așa că am crezut că - acest răspuns demn de a fi aici. Îmi pare rău.
O altă opțiune este de a utiliza cuvinte cheie params
Numit ca...
În C#, în mod normal, aș folosi mai multe forme de metoda:
ACTUALIZARE: Acest menționat mai sus a FOST modul în care am făcut valorile implicite cu C# 2.0. Proiectele I'm de lucru pe acum folosesc C# 4.0, care acum susține în mod direct parametrii opționali. Aici este un exemplu, am folosit doar în propriul meu cod:
De pe acest site:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C# nu permite utilizarea [Opțional] atribut (de la VB, deși nu este funcțional în C#). Astfel încât să puteți avea o metoda de genul asta:
În API-ul nostru înveliș, putem detecta parametri opționali (ParameterInfo p.IsOptional) și setați o valoare implicită. Scopul este de a marca parametri ca opțional fără a recurge la "făcăturile" ca având "opțional" în numele parametrului.
Ai putea folosi metoda supraîncărcarea...
Aceasta depinde de metoda de semnături, am dat exemplu, lipsește "int b" singura metodă pentru că ar avea aceeași semnătură ca "int o" metodă.
Ai putea folosi Null tipuri...
Apoi veți putea verifica, folosind-o.HasValue, pentru a vedea dacă un parametru a fost stabilit.
O altă opțiune ar fi să utilizați un 'params' parametru.
Dacă ai vrut să mergi cu nume parametrii care ar avea nevoie pentru a crea un tip să se ocupe de ei, deși cred că există deja ceva de genul asta pentru aplicații web.
Puteți utiliza parametrii opționali in C# 4.0 fără griji. Dacă avem o metodă cum ar fi:
atunci când apelați metoda, puteți sări peste parametri, cum ar fi aceasta:
C# 4.0 pune în aplicare o caracteristică numit "parametri numit", puteți trece de fapt parametrii de numele lor, și, bineînțeles, puteți trece parametrii in orice ordine vrei :)
Alo Opțional Lume
Dacă doriți runtime pentru a furniza un parametru implicit valoare, trebuie să utilizați reflecție pentru a efectua apelul. Nu la fel de frumos ca alte sugestii pentru această întrebare, dar compatibil cu VB.NET.
O modalitate ușoară care vă permite să omiteți parametri in orice poziție, profită de null tipuri, după cum urmează:
Siruri de caractere sunt deja null tipuri, astfel încât acestea să't nevoie de ?.
Odată ce aveți această metodă, următoarele apeluri toate valabile:
Când definiți o metodă în acest fel aveți libertatea de a stabili doar parametrii doriți de denumire le. A se vedea link-ul următor pentru mai multe informații despre nume și parametri opționali:
Nume și Argumente Opționale (C# de Programare Ghid) @ MSDN
Sunt de acord cu stephenbayer. Dar din moment ce este un serviciu web, este mai ușor pentru utilizator de a utiliza doar o formă de webmethod, decât folosind mai multe versiuni de aceeași metodă. Cred că în această situație poate fi nul Tipuri sunt perfecte pentru parametri opționali.
parametrii opționali sunt de metode. dacă ai nevoie de argumente opționale pentru o clasă și sunt:
clasa myClass { publice myClass(int myInt = 1, șir myString = "wow, acest lucru este cool: nu pot avea un default string") { // facem ceva aici, dacă este necesar } }
clasa myClass { publice myClass() { // acest lucru este implicit constructor }
publice myClass(int myInt) : acest(myInt, "orice") { // facem ceva aici, dacă este necesar } publice myClass(string myString) : acest(0, myString) { // facem ceva aici, dacă este necesar } publice myClass(int myInt, string myString) { // facem ceva aici, dacă este necesar - aceasta este maestru constructor } }
Modul tipic în care aceasta este tratată în C# ca stephen menționat este de a supraîncărca metodă. Prin crearea mai multor versiuni de metoda cu parametri diferiți ai crea în mod eficient parametrii opționali. În formele cu mai puțini parametri ai de obicei sun formă de metoda cu toți parametrii setarea valorilor implicite în apel la această metodă.
Folosind suprasarcini sau folosind C# 4.0 sau mai sus
Puteți suprasarcină metoda ta. O metodă conține un singur parametru
GetFooBar(int a)
iar cealaltă conține ambii parametri,GetFooBar(int a, int b)
Un pic cam târziu la petrecere, dar am fost în căutarea pentru răspunsul la această întrebare și, în cele din urmă a dat seama încă un alt mod de a face acest lucru. Declara tipuri de date pentru opțional args de web metodă să fie de tip XmlNode. Dacă optional arg este omis acest lucru va fi setat la nul, și dacă-l's cadou puteți obține este de valoare șir de asteptare arg.Valoare, și anume,
Ce's, de asemenea, decent despre această abordare este .NET generat de pagina de start pentru ws prezinta in continuare lista de argumente (deși te-ai pierde la îndemână textul de intrare cutii pentru testare).
În loc de default parametri, de ce nu a construi un dicționar de clasă din querystring a trecut .. o implementare care este aproape identic cu modul asp.net forme de lucru cu querystrings.
adică Cerere.QueryString["o"]
Acest lucru va decupla frunze de clasa din fabrica / cod șabloane.
Ai, de asemenea, s-ar putea să doriți să verificați Servicii Web cu ASP.NET. Serviciile Web sunt un api web generate automat prin atribute pe C# clase.
Pentru doar în cazul în care cineva vrea să treacă un apel invers (sau "delegare") ca un parametru opțional, se poate face în acest mod.
Optional Callback parametru:
parametrii opționali sunt nimic, dar implicit parametrii! vă sugerez să vă dau ambii parametri implicite. GetFooBar(int a=0, int b=0), dacă nu't au orice metodă supraîncărcat, va duce la o=0, b=0, dacă nu't trece orice valori,dacă treci de 1 valoare, va avea ca rezultat, a trecut de valoare pentru un, 0 și, dacă treci de 2 valori 1 va fi atribuit-o și a doua pentru b.
sper că asta îți răspunde la întrebare.
În cazul în care valorile implicite sunt't la dispoziție o modalitate de a adăuga un parametru opțional este de a utiliza .NET OptionalAttribute clasa - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute?view=netframework-4.8
Exemplu de cod de mai jos:
Am un serviciu web pentru a scrie care are 7 parametri. Fiecare este un opțional de interogare atribuie o declarație sql înfășurat de acest serviciu web. Deci două soluții non-optional params vin în minte... ambele destul de slab:
metoda1(param1, param2, param 3, param 4, param 5, param 6, param7) metoda1(param1, param2, param3, param 4, param5, param 6) metoda 1(param1, param2, param3, param4, param5, param7)... start pentru a vedea imaginea. În acest fel se află nebunie. Prea multe combinații.
Acum, pentru un mod mai simplu care arata ciudat, dar ar trebui să funcționeze: metoda1(param1, bool useParam1, param2, bool useParam2, etc...)
Ca's un apel de metodă, valorile pentru toți parametrii sunt necesare, și se va ocupa de fiecare caz în interiorul acestuia. L's, de asemenea, clar cum să-l folosească din interfață.
L's un hack, dar se va lucra.
Am avut de a face acest lucru într-un VB.Net Web 2.0 Service. Am sfârșit prin a preciza parametrii ca siruri de caractere, apoi de a le converti la orice am nevoie. Un parametru opțional a fost specificat cu un șir gol. Nu mai curată soluție, dar a mers. Doar fii atent că te prind toate excepțiile care pot apărea.