Functie cu numar variabil de parametri - C#
Sa continuam discutia despre numarul parametri cu acesta noua problema , o functie cu numar variabil de parametri. Ce inseamna acest lucru mai exact ? In mod normal, pana acum cand scriati o functie care primea parametri, scriati in felul urmator:
-
tip nume(tip nume,tip nume ... tip,nume)
-
{}
Ce se intampla daca nu stiu de dinainte de cati parametri voi avea nevoie ? Sa zicem ca as dori sa apelez in felul urmator:
-
...
-
functie(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
Probabil ca unii dintre voi deja s-au apucat sa declare parametrii (
) . Sau sa luam un alt exemplu, mai practic. Ce face urmatoarea functie?
-
int a,b;
-
a=10;
-
b=20;
-
Console.Write("a={0} si b={1}", a, b);
Sau , mai general, urmatorul exemplu:
-
int a = 1;
-
string b = "text";
-
float c=1.23f;
-
double d=11111111000;
-
Console.Write("a={0} si b={1} si c={2} si d={3}", a, b, c, d);
Exista situatii, unele mai practice decat altele, in care nu stim de la inceput cati parametri va avea functia. Mai mult de atat, poate stim de dinainte cati parametri va avea functia, dar nu stim care este tipul lor. Un caz "celebru" este cel al programatorului anonim,amator de Coca-Cola, cu ochii inrositi, care isi doreste sa aiba o functie pentru care nu stie nici numarul nici tipul parametrilor ( cu toate ca, in practica, asa ceva nu exista , utilizatorul intotdeauna va introduce datele necesare ). Pot spune ca este mai mult un "moft" ( interesant moft totusi ) .
Din fericire, C#-ul ne rezolva toate probleme, punandu-le la dispozitie o metoda speciala de transmitere a parametrilor.Dupa cum probabil stiti din C++, putem transmite parametri prin valoare sau prin referinta. C#-ul introduce o noua modalitate de transmitere, special realizata pentru lucrul cu numarul variabil de parametri, si anume "params".
-
static void functie(params[] int parametri)
In acest exemplu, am specificat faptul ca functia primeste un numar variabil de parametri de tip "int". "Variabil", nu prea putem spune deoarece putem cunoaste numarul lor
-
int nr_parametri=parametri.Length;
Exemplu de program care apeleaza o functie cu un numar variabil de parametri de tip int si calculeaza suma lor:
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
namespace Parametri
-
{
-
class Program
-
{
-
-
static int functie(params int[] x)
-
{
-
int suma = 0,i;
-
for (i = 0; i <x.Length; i++)
-
suma += x[i];
-
return suma;
-
-
}
-
-
-
static void Main(string[] param)
-
{
-
Console.WriteLine(functie(1, 2, 3, 4));
-
Console.Read();
-
-
}
-
}
-
}
Acum , sa luam celalalt caz, in care nu stim nici ce tip au parametrii . Pentru acest caz, C#-ul de pune la dispozitie un tip generic, numit "object" . Aceste poate fi de orice tip ( int, string, char,float,bool, etc. ) .Antetul functiei cu numar variabil de parametri de tip variabil va fi urmatorul:
-
static void functie(params object[] x)
Stim numarul lor ( x.Length ), dar acum am dori sa-i si deosebim. Sa presupunem ca dorim sa calculam suma parametrilor de tip int.Ar trebui sa verificam acest lucru mai intai, pentru ca adunarea sa se poata realiza. Tipul unei variabile poate fi returnat sub forma unui sir de caractere . De exemplu, pentru o variabila de tip int, tipul sau se va numi "System.Int32" . Un mic ajutor din partea C#-ului, dupa cum observati. Acum, tot ceea ce trebuie sa facem este sa comparam acest sir de caractere cu sirul de caractere al tipului fiecarei variabile din lista de parametri.
-
if (x[i].GetType().ToString() == "System.Int32")
-
....
In cazul anterior, stiam deja ca parametrii sunt de tip int ,asa ca atunci cand calculam suma, ii adaugam pur si simplu.Acum, chiar daca facem verificarea, parametrii sunt totusi de tip "object" . Totusi, daca am facut verificarea cu "System.Int32", inseamna ca acum putem sa ii convertim catre acest tip.Acest lucru se poate realiza in felul urmator:
-
static int functie(params object[] x)
-
{
-
int suma = 0,i;
-
for (i = 0; i <x.Length; i++)
-
if (x[i].GetType().ToString() == "System.Int32")
-
suma += System.Convert.ToInt32(x[i]);
-
return suma;
-
}
Acum vom putea apela functia si in felul urmator:
-
Console.WriteLine(functie(1, 2, 3, 4,"a",false,1.23));
4 Comments
Salut . In primul rand, iti multumesc pentru comentariu . Nu iti contest in niciun fel cunostintele legate de POO si C# . Chestia este insa ca , dupa cum bine vezi pe aceasta pagina , nu am prea scris cod pentru C# . De altfel, nu ma declar fan al acestui limbaj iar amator e deja prea mult spus . Am dat acest exemplu pentru a evidentia usurinta cu care un limbaj interpretat rezolva aceasta problema mai dificil de rezolvat intr-un limbaj nativ, precum C sau, si mai rau , ASM
Sper ca nu te superi ...
Legat de params, se pune [] dupa Type (dupa int), nu dupa params cum apare in text.
este: static void functie(params int[] parametri)
Multumiri pentru articol.![]()
Cu placere
Ti-a fost de folos la ceva ?
Cam habar n-ai.
In primul rand ca sa testezi de tip ar trebui sa folsesti
1.if(x[i].GetType() == typeof(int))
testarea dupa stringul din Type.ToString() este extrem de ineficienta
(se compara 2 stringuri in loc sa se compare 2 referinte). Plus ca nu ai nici o garantie in specificatia de limbaj ca ToString() intoarece numele tipului in forma aia. Poate intr-o versiune urmatoare de framework va fii altfel.
2. Mai elegant se poate testa tipul cu
if(x[i] is int)
Partea faina la is este ca testeaza toata ierarhia de mostenire a obiectului. In cazul nostru poate vrem sa stim daca
(x[i] is IComparable )ceea ce nu se poate afla nici cu == typeof(IComparable).
A doua problema e conversia la int. Daca ii stii tipul cel mai eficient mod de converie este castul:
suma += (int)x[i];
Apelul la Convert.ToInt32(object o) e folositor cand vrem sa convertim un alt tip (ex. string) la int. Convert de la int la int este iar extrem de ineficient