C# 4.0 a fost anuntat in .Net Framework 4.0, care a fost lansat in aprilie, anul acesta.
Principala tema abordata este programare dinamica (obiectele sunt dinamice, structura si comportamentul lor nu sunt reprezentate de un tip static). Limbaje dinamice din .Net Framework sunt IronRuby, Iron Python. Javascript este cel mai folosit limbaj dinamic. Despre cum a fost introdus tipul dynamic in C#, care este un limbaj static, si modul in care este folosit, vom scrie intr-un viitor articol. O functionalitate foarte utila, pe care vreau sa o dezvolt in acest articol, este legata de parametri.
Ce este un parametru optional ?
O definite a unui parametru optional poate fi: un parametru care nu are nevoie de transmiterea unui argument la apelul metodei.
In C# 4.0, parametri pot fi considerati optionali (dezvoltatorii in VB stiu de parametri optionali) daca le oferim o valoare implicita atunci cand ii declaram. La apelare, parametri optionali pot fi omisi.
Cream un proiect de tip Console in Visual Studio 2010.
Adaugam o metoda care va primi trei parametri de tip int si va returna suma lor.
static int Calculeaza(int x, int y, int z) { return x + y + z; }
Apelul se face normal: Calculeaza(3,4,5);
Rezultatul va fi 12.
Sa prespunem ca avem situatia cand vrem sa adunam doar doua numere, sa folosim doar doi parametri. In acest caz, vom folosi un parametru optional.
Reluam: un parametru este tratat ca optional atunci cand i se atribuie o valoare.
Exemplu:
static int Calculeaza(int x, int y, int z = 5) { return x + y + z; }
Compute(3,4);
Rezultatul va fi: 12.
Un parametru optional are o valoare implicita. Daca nu transmitem argumentul pentru respectivul parametru, valoarea implicita va fi folosita.
Pentru valori implicite ale parametrilor optionali putem folosi expresii constante (const in C#) sau default (returneaza valoarea implicita pentru tipul primit ca parametru – null pentru tipurile referinta, zero pentru tipurile valoare).
const int valoareConstanta = 500; static intCalculeaza(intx, int y = default(int), int z = valoareConstanta) { return x+y+z; }
In Visual Studio 2010, Intellisense arata cand un parametru este optional:

Parametri optionali trebuie sa fie declarati la sfarsitul listei de parametri. Altfel, va fi afisata eroarea: “Optional parameters must appear after all required parameters”.
C# nu permite omiterea parametrilor in genul: Compute (x,y,).
Parametri optionali pot fi folosit cu indecsi, constructori, delegati.
Observatie: Parametri optionali nu pot fi marcati cu ref sau out.
Dupa prezentarea a ceea ce inseamna un parametru optional, apare o intrebare:
Parametri optionali au impact asupra supraincarcarii ?
Raspuns: Da, dar nu cu foarte mari implicatii.
De exemplu, folosim supraincarcarea in cadrul unei clase pentru a defini mai multe metode, toate cu acelasi nume, dar cu tipul si numarul parametrilor diferit.
static void Metoda(string s, int i =1) { Console.WriteLine("Metoda 1"); } static void Metoda(object o) { Console.WriteLine("Metoda 2"); } static void Metoda(int i, string s = "hello") { Console.WriteLine("Metoda 3"); } static void Metoda(int i) { Console.WriteLine("Metoda 4"); }
Apelam, Metoda(5);
Observam ca pentru acest apel, in afara de prima metoda, toate metodele pot fi aplicate. Se elimina si cea in care se face conversie la object pentru ca avem Metoda (int i) care primeste un int. Aceasta este mai buna si decat Metoda (int i, string s=”Hello”) care are parametru optional.
Va afisat mesajul: Metoda 4.
“Named arguments”
C# 4.0 suporta si conceptul de “named arguments”. Orice parametru poate fi transmis prin numele sau, nu doar prin pozitia lui. Acest lucru contribuie si la o mai buna intelegere a codului.
Exemplu:
Calculeaza(z: 100, x: 40, y: 100);
Observatie: Argumentele sunt evaluate in ordinea in care apar. Aceasta diferenta este evidenta in cazul unor expresii care exista intr-o anumita dependinta.
O abordare viitoare legata de C# o constituie co-existenta cu Visual Basic. Ambele limbaje isi vor pastra caracteristicile, dar noile functionalitati ce vor fi adaugate vor fi introduse si in C# si in VB, in acelasi timp. Cel putin, asa promit cei de la Microsoft. :)
Personal, parametrii optionali reprezinta unica functionalitate favorita din C# 4.0.
Mai multe informatii despre C# 4.0 si viitorul limbajului de programare se pot afla in sesiunea video C# 4.0 and beyound de Anders Hejlsberg.
P.S.
Am scris metodele:
static int Calculeaza(int x, int y = 19 ) { return x + y; } static int Calculeaza(int x, int y= default(int), int z = default(int)) { return x+y+z; }
Apelez: Calculeaza(100);
Stie cineva rezultatul?:D
Jean Valjean says:
Abia acum, in C# 4.0 s-au introdus parametrii optionali ??
No ofence, dar PHP o are vreo 10 ani, de pe vremea lui PHP4.
zeltera says:
Jean, aici nu e vorba despre cine e mai tare din parcare… ci despre prezentarea unui limbaj, cu plusurile si minusurile lui. php si c# nu sunt limbaje concurente direct – se intersecteaza pe undeva pe la asp.net. Sunt multe alte limbaje care au sau nu au aceasta facilitate, care mie nu mi se pare asa de critica, din moment ce pot sa fac override la orice metoda foarte simplu.
Bogdan says:
Interesant articolul.
Iar rezultatul e:
Error 1 The call is ambiguous between the following methods or properties: ‘ConsoleApplication2.Program.Calculeaza(int, int)’ and ‘ConsoleApplication2.Program.Calculeaza(int, int, int)’
:)
Jean Valjean says:
Cred ca am fost inteles gresit, doar m-am mirat ca nu exista inca in C# aceasta facilitate intens utilizata in PHP. Dar acum am inteles, C# fiind o clona de Java incearca sa o imite, Java nu o are inca si asta explica intarzierea implementarii. ;)
zeltera says:
Nu stiu daca te am inteles gresit sau nu, ci doar am facut o precizare. Lucrurile trebuiesc luate asa cum sunt ele, bune sau rele, si decis daca le folosim sau nu – sau mai exact ce e mai bine sa folosim intr-un anumit context.
Tu esti programator de java?
marius says:
@Bogdan
Dap, ai dreptate. Iti fac cinste cu o bere. Daca esti din Bucuresti, ar fi si mai bine. :)
Compilatorul nu isi da seama ce metoda sa apeleze. Poate fi omis parametrul optional de la prima metoda sau omisi ambii parametri optionali de la a doua metoda.