Documente Academic
Documente Profesional
Documente Cultură
NET
Catruc A.
Prezentare
.NET este un cadru (Framework) de dezvoltare software care permite realizarea,
distribuirea și rularea aplicațiilor-desktop Windows. .NET este conceput și dezvoltat de
Microsoft. Prima versiune a cadrului .Net a fost 1.0, care a venit în anul 2002.
Cu alte cuvinte, este o mașină virtuală pentru compilarea și executarea de programe scrise
în diferite limbaje de programare precum C #, VB.Net ș.a.
Este utilizat pentru a dezvolta aplicații bazate pe Form, aplicații bazate pe Web și servicii
Web. Este folosit pentru a construi aplicații pentru Windows, mobile, web, etc.
Prezentare
Pentru a dezvolta aplicații pe platforma .NET este bine sa avem 3
componente esențiale:
un set de limbaje (C#, Visual Basic .NET, Smalltalk, Perl, Cobol, Lisp,
Pascal ș.a.),
aceste limbaje respectã niște specificații OOP numite Common Type System
directorul
C:\WINDOWS\Microsoft.NET\Framework\V2.0….
linia 2: este o directivă care specifică faptul că se vor folosi clase incluse în spaţiul de nume
System. În cazul nostru, se va folosi clasa Console.
linia 5: orice program C# este alcătuit din una sau mai multe clase
linia 9: clasa Console, amintită mai sus, este folosită pentru operaţiile de intrare/ieşire.
Aici se apelează metoda WriteLine din această clasă, pentru afişarea mesajului dorit pe ecran.
Ca şi limbajul C++ cu care se înrudeşte, limbajul C# are un alfabet format din litere mari şi
mici ale alfabetului englez, cifre şi alte semne. Vocabularul limbajului este format din acele
„simboluri” cu semnificaţii lexicale în scrierea programelor: cuvinte (nume), expresii,
separatori, delimitatori şi comentarii.
COMENTARII
comentariu pe un rând prin folosirea //. Tot ce urmează după caracterele // sunt
considerate, din acel loc până la sfârşitul rândului, drept comentarii.
comentariu pe mai multe rânduri prin folosirea /* şi */. Orice text cuprins între
simbolurile menţionate mai sus se consideră a fi comentariu. Simbolurile /* reprezintă
începutul comentariului, iar */ sfârşitul respectivului comentariu.
Prin nume dat unei variabile, clase, metode etc. înţelegem o succesiune de caractere care
îndeplineşte următoarele reguli:
numele trebuie să înceapă cu o literă sau cu unul dintre caracterele ”_” şi ”@”;
primul caracter poate fi urmat numai de litere, cifre sau un caracter de subliniere;
numele care reprezintă cuvinte cheie nu pot fi folosite în alt scop decât acela pentru
care au fost definite;
cuvintele cheie pot fi folosite în alt scop numai dacă sunt precedate de @;
două nume sunt distincte dacă diferă prin cel puţin un caracter (fie el şi literă mică ce
diferă de aceeaşi literă majusculă).
în cazul numelor claselor, metodelor, a proprietăţilor, enumerărilor, interfeţelor,
spaţiilor de nume, fiecare cuvânt care compune numele începe cu majusculă;
în cazul numelor variabilelor, dacă numele este compus din mai multe cuvinte, primul
începe cu minusculă, celelalte cu majusculă.
Variabilă – o locație rezervată în memoria calculatorului în care putem stoca informații, astfel
putem stoca diferite tipuri de date într-o variabilă fie șiruri de caractere, fie numere ș.a . C#
este „case sensitive”. Deși numele variabilei poate fi orice, ar trebui să dați variabilelor nume
descriptive care indică scopul lor.
unde tip reprezintă tipul variabilei, iar nume_variabilă numele variabilei. Variabilele trebuie
declalarate înainte de a fi folosite, de asemenea tipul variabilei nu poate fi modificat pe
parcursul duratei sale de viață. Tipul variabilei determină operațiile permise asupra variabilei.
După declararea variabilei, aceasta trebuie inițializată. Inițializarea unei variabile poate fi
făcută printr-o instrucțiune de atribuire:
De asemenea inițialzarea poate fi făcută dinamic, utilizând orice expresie validă la momentul
în care variabila este inițializată. La fel ca alte limbaje de programare, C# permite declararea
unei variabile în cadrul unui bloc. Un bloc începe cu o acolada deschisă și se încheie cu o
acolada închisă.
În cazul, în care doriți să declarați variabile de diferite tipuri, trebuie să le declarați separat. Nu
veți putea aloca tipuri diferite de date în cadrul unei declarații cu mai multe variabile.
De preferat să avem un spațiu, atunci cînd folosim simbolul de asignare „=” pentru a avea
o vizibilitate mai bună. Pentru a putea afișa valoarea variabilei vom folosi funcția
Console.WriteLine();
În cazul în care doriți să atribuiți o valoare unei variabile de la tastatură, atunci veți folosi
funcția Console.ReadLine();
Rezultat:
Mai jos, este prezentat un exemplu de concatenare a două variabile de tip integer.În C#
concatenarea se face cu ajutorul unei metode String.Concat(,);
TIPURILE DE DATE
Tipurile de date și operatorii stau la baza oricărui limbaj de programare. C# oferă o gamă largă
de tipuri de date și operatori. Vom începe prin examinarea tipurilor de date fundamentale în
C#. Înainte de aceasta, amintim că limbajul este puternic tipizat. Aceasta înseamnă că pentru
toate operațiile, compilatorul realizează verificări asupra compatibilității tipurilor. Limbajul C#
include două categorii generale de tipuri predefinite: tipuri valorice și tipuri referință.
Tipurile referință din C# sunt definite de clase. La baza limbajului C# stau 13 tipuri valorice
numite și tipuri simple. Aceasta datorită faptului că există o relație directă între tipurile de date
C# și tipurile de date .NET. Din rațiuni de portablitate, în C#, fiecare dintre tipurile valorice
are domeniu fix de valori. Dacă de exemplu în limbajul C, o varabilă de tip int este reprezentata
pe 2 octeți sau 4 octeți, în funcție de platforma utilizată, în C# unei variabile de tip int,
calculatorul îi aloca 4 octeți, indiferent de mediul de execuție.
Toate tipurile de date sunt derivate din tipul System.Object. Toate tipurile valoare sunt derivate
din clasa System. ValueType, derivată la rândul ei din clasa Object (alias pentru
System.Object) .Limbajul C# conţine un set de tipuri predefinite (int, bool etc.) şi permite
definirea unor tipuri proprii (enum, struct, class etc.).
1. Tip integer
Acest tip de date este utilizat pentru a lucra cu numere. Ca exemplu, numere întregi sunt 20,30
sau 50. În C# acest tip de date este notat cu cuvîntul cheie int sau Int32. În exemplul de mai
jos vom declara o variabilă căreia îi vom atribui o valoare de tip int și vom afișa corespunzător.
Rezultatul:
o Tipul de date int este specificat pentru a declara o variabilă number.Variabila number
are atribuit valoarea 30.
o Funcția Console.WriteLine() este utilizată pentru a afișa numărul pe consolă.
o Dacă ați introdus codul corect atunci programul va funcționa și veți avea rezultat.
o Tipul de date String este specificat pentru a declara o variabilă msg . Variabilei msg
are atribuit valoarea Hello.
o Cu ajutorul funcției Console.WriteLine() este utilizată pentru a afișa valoarea.
o Dacă ați introdus codul corect atunci programul va funcționa și veți avea rezultat.
Rezultatul :
o Tipul de date bolean este specificat pentru a declara o variabilă. Variabilei statut îi este
atribuit o valoare de adevăr sau fals.
o Cu ajutorul funcției Console.WriteLine() este utilizată pentru a afișa valoarea.
o Dacă ați introdus codul corect atunci programul va funcționa și veți avea rezultat.
Analizați codul:
LITERALI
În C# literalii desemnează valorile fixate, reprezentate într-un mod accesibil utilizatorului. Literalii în
C# pot fi de orice tip valoric.
Tipuri de literali:
În .Net, există două constante booleane (de la tipul de date boolean): adevărat și fals:
Literali de tip întreg acest tip de literal este destinat să reprezinte,numere întregi pozitivi și negativi,
de exemplu 9, 0, 11, 42,-10.
Literali de tip Binar . Să declarăm x, puteți scrie un literal numeric în formă binară. Pentru aceasta,
scrieți 0b și apoi scrieți 1 și 0. Acesta este numărul reprezentat de zerouri și unu.
Literali de tip octal. Conceput pentru a reprezenta numerele în sistemul numeric octal, se folosește
prefixul 0, după care se scrie numărul octal (de la 0 la 7): 0123, 0742, 0349.
Literali de tip zecimal. Conceput pentru a reprezenta numerele în sistemul numeric zecimal, care se
scrie numărul zecimal , în mod obișnuit -5,10,500.
Literali de tip hexazecimal. Sunt destinate sistemului numeric hexazecimal, se folosește prefixul 0x,
după care se scrie numărul în sistemul hexazecimal (de la 0 la 9 și de la A la F): 0x12, 0xA56B, 0xff430.
Recapitulare:
Caracterele sunt cuprinse între ghilimele: „a”, „x”, „%”. Pe lângă caracterele obișnuite, un literal de tip
string poate conține mai multe secvențe escape
Recapitulare
OVERFLOW
Deci, să vorbim despre formatarea șirurilor. La lecțiile precedente, pentru a afișa mai multe valori tot timpul
s-a apelat la funcția Console.WriteLine(), prin urmare, dacă a fost nevoie de făcut două afișări atunci s-a
folosit de două ori apelul funcției Console.WriteLine().
Să aruncăm o privire asupra diferitelor moduri de formatare. Deci, să creăm un șir cu un apel la metoda
Format(). Cum lucrează această metodă? Spre exemplu vreau să afișez următoarele: Numele meu este Ion
și am 35 ani!. Dar, în același timp, valoarea lui Ion și 35 vor fi stocate în variabile de diferite tipuri. Prima
modalitate de a ieși pe consolă este următoarea:
Acum să vedem ce se întâmplă aici. {0} și {1} se numesc placeholder sau substituent. Acestea sunt
locurile în care valoarea din variabilele specificate după virgulă va fi înserată în ordine. Aici, chiar pot fi
folosite literalele direct, adică să scrim “Ion”. Numerele între paranteze înseamnă ordinea variabilei după
virgulă, prin urmare, dacă schimbăm pozițiile 0 și 1, apare prima dată vârsta, apoi numele. Cu alte cuvinte,
acestea sunt nemijlocit niste indecși.
De fapt, deasemenea este posibil să se creeze un astfel de șir folosind concatenarea ( semnul „+”.)
De fapt sunt o mulțime de avantaje. În primul rînd, codul este mult mai citeț dacă utilizăm metoda Format,
în al doilea rînd această metodă dispune de un șir de proprietăți, care cu ajutorul concatenării nu este posibil
de le realizat – și anume, formatarea specializată.
Exemplu:
Adică, chiar în placeholder putem introduce numele variabilelor. Aceasta este mult mai succint și prin
urmare mai citeț. Aceasta se numește interpolarea șirurilor, iar elementul cheie constituie simbolul $. Dacă
noi omitem acest simbol, atunci C sharp va interpreta tot conținutul ca fiind parte a unui șir simplu.
Cum să formăm o linie, astfel încât să existe o trecere din rînd nou chiar în interiorul ei. Pentru aceasta
avem la dispoziție așa numitele secvențele escape. Creăm un nou șir:
Cerinte:Tot din secvențele escape des întîlnite sunt cele de indentare (tab-ulare)
Pentru a trece din rînd nou poate fi folosită încă o proprietate de tipul Environment:
Care este diferența? Chestia este că întoarcerea la o linie nouă funcționează diferit în diferite sisteme de
operare. Într-un caz, trebuie să utilizați „\ r \ n” - retur și linie nouă, iar într-un alt caz, „\ n” este suficient.
Deci, pentru a nu face o greșeală și aplicația dvs. să fie multiplatformă s-a efectuat corect traducerea către
o nouă linie sub diferite sisteme de operare, trebuie să utilizați Environment.NewLine. Funcționează corect
în toate sistemele de operare. Aceasta este întreaga diferență.
Rețineți că, în exemplul de mai sus, există un spațiu după metoda {Environment.NewLine} pentru
claritate. Cum să procedăm dacă avem nevoie într-un șir de afișat ghilimele?
Dar dacă vrem să imprimăm „\” în interiorul șirului. De exemplu, creăm un șir care duce la o locație sau
un fișier de pe disc.
Un alt mod în care vom analiza crearea unui șir este folosirea simbolului - @.
Acesta este așa-numitul verbatim string - un șir care conține doar caractere.
Compilatorul înțelege că aceasta face parte dintr-un șir. Acest lucru este convenabil atunci când, de
exemplu, avem o mulțime de bare slash/. Pentru a nu le face zeci de semne, putem preceda linia cu acest
simbol @ special și putem folosi bare slash doar câte una.
În următorul exemplu:
d – este simbolul de formatare. Este folosit pentru a afișa numere întregi. După d, putem adăuga un număr
care va indica numărul de caractere pentru afișarea acestui număr.
De exemplu
Vom obține. Dacă numărul dvs. este format din patru numere, atunci d4 nu afectează nimic, dar dacă este
mai mic, ca în cazul considerat, atunci rezultatul afișat va fi umplut cu zerouri.
Dacă scoatem un număr cu virgulă, putem folosi formatarea f - float, adică cu virgulă mobilă.
Efect de rotunjire:
În acest sistem, în calitate de monedă este setată cu ruble. Acest lucru se datorează formatării C.
C - funcționează pentru afisarea formatului monetar. În mod implicit, C funcționează ca C2, adică afișează
două zecimale. De asemenea, putem trece formatul astfel:
Să comparăm cele două linii. Pentru a face acest lucru, vom crea două variabile care vor conține
șiruri. Pentru început, aceste linii vor fi identice. Să verificăm comparându-le cu operatorul
obișnuit de comparație:
Definiţie: două şiruri se consideră egale dacă sunt amândouă null, sau dacă amândouă au aceeaşi
lungime şi pe fiecare poziţie au caractere respectiv identice. În caz contrar şirurile se consideră
diferite.
Compararea prin operatorul ==, de fapt, este identică cu compararea string.Equals în regimul de
comparare Ordinal
Comparația metodei Ordinal și simplu str1 == str2 sunt complet identice ca semnificație. Luați în
considerare următoarele 2 rânduri și analizați ce vor afișa diferitele moduri de comparație.
Mod ordinal, ia valoarea octetului fiecărui caracter și o compară. Prin urmare, reprezentarea pe
octetului 5 (și ulterioare) caractere ale șirurilor este diferită și obținem False. Astfel, compilatorul
crede că aceste linii sunt diferite.
InvariantCulture, spre deosebire de Ordinal, nu compară cele două șiruri caracter cu caracter. El
„înțelege” unele reguli lingvistice și în acest caz acest mod face așa-numita Expansiune, adică
extinderea unui caracter special la două cu „ss”. În consecință, el primește două linii identice și le
consideră identice.
Faptul că CurrentCulture ne-a dat adevărat este cel mai probabil o coincidență. Deoarece, dacă
pe acest computer a existat Culture care nu are legătură cu setările locale, ci mod implicit, ar putea
primi False.
Dacă comparația dvs. nu implică luarea în considerare a specificului lingvistic, atunci utilizați
Ordinal. Mai mult, funcționează mai repede decât toate celelalte moduri.
În majoritatea cazurilor, InvariantCulture nu este recomandată. Singura excepție atunci când este
utilizată este atunci când trebuie să aplicați regula lingvistică de bază a unui „alfabet standard”
definit de acest mod InvariantCulture. Pentru a face acest lucru, trebuie să vă adânciți în teoria
cum funcționează și să aflați ce simboluri și cum va interpreta. Doar în acest caz îl puteți folosi.
De fapt, este rar folosit deoarece poate provoca rezultate neașteptate.
Dar, dacă trebuie să țineți cont de specificul unui anumit alfabet, așa-numita cultură, atunci este
mai bine să utilizați CurrentCulture. El, în mod implicit, va fi preluat de pe mașina locală. În mod
convențional, cultura va fi preluată din cultura instalată pe sistemul de operare. Cultura poate fi
reinstalată explicit, adică suprascrisă. Am folosit deja acest lucru
LIBRĂRIA MATH
Metoda Math. Este încorporat în Visual Studio și ne facilitează programarea. Și să vorbim despre
un modul care ne permite să facem câteva calcule, cum ar fi rotunjirea și luarea rădăcinii pătrate.
Apare aceea “inteligență” care ne dă câteva indicii. În partea de jos putem aplica anumite filtre.
Putem filtra după: Snippets(fragmente), Clases(clase), Delegates(delegați), Methodes( metode)
….
Fragmentele este cea mai simplă metodă de introducere de cod, de exemplu, atunci când dorim să
introduceți CO, poate apărea Console. Cele mai utilizate filtre sunt clasele și metodele.
Când tastăm Math. apare pentru constante: Aici vedem Pi, aceasta este, de asemenea, o constantă
care este de aproximativ 3,14.
Pentru a apela o metodă specifică, trebuie doar să introduceți câteva litere din numele unei metode,
iar “intelisense” va sugera în continuare o potrivire. Cu ajutorul acestei metode Pow() avem
posibilitatea de a afla patratul unui număr. Și pentru a calcula rădăcina pătrată putem utiliza funcția
Sqrt(). Round() este o funcție de rotunjire.
AwayFromZero este un mod în care numărul este rotunjit la cel mai apropiat număr de la zero. În
modul ToEven, rotunjește la cel mai apropiat nivel. Ce observăm, că prima și ultima metodă au
aceelaș rezultat, iar AwayFrom Zero deja are alt rezultat(3).
În acest context nu trebuie de uitat despre aceste moduri. Uneori programatorii sunt deseori
surprinși de rezultatul obținerii în urma rotunjiri folosind funcția Round(). Selectarea modului se
face în funcție de domeniul în care este utilizat. De exemplu, ToEven se face în calcule financiare.
El dă statistic acest lucru valoarea la care nu pierdem bani, când sunt rotunjiți.
Construcțiile condiționate – sunt una dintre componentele de bază ale mai multor limbaje de programare
care direcționează programul de-a lungul uneia dintre condițiile indicate. Limbajul C # folosește
următoarele construcții condiționale : if..else și switch..case.
Instrucțiunea if
Construcția if / else verifică adevărul unei anumite condiții și în funcție de rezultatele verificării este
executat un cod. În exemplul de mai jos vedem cum se comportă programul utilizând doar if:
if (x = = y) → x == y este condiția declarației if. Condițiile sunt scrise în interiorul „()”. Aici condiția
este adevărată. Deoarece condiția este adevărată, declarațiile din interiorul if vor fi executate, {} după if
reprezintă corpul if. Totul scris în interiorul „{}” face parte din if. Condiția if este verificată mai întâi
și dacă este adevărată, atunci sunt executate instrucțiunile din interiorul if. În caz contrar, nu se va afișa
nimic. Pentru a evita acest lucru vom adăuga construcția Else();
Clauza else;
Mai jos este prezentat un exemplul în care nu se va îndeplini condiția din if(), atunci se va îndeplini
ceea ce este în clauza else :
Inctrucțiunea switch()
Instrucțiunea switch poate fi utilizată în locul instrucțiunii if else atunci când doriți să testați o variabilă
în funcție de trei sau mai multe condiții.
Instrucțiunea switch(), începe cu cuvântul cheie switch care conține o expresie de potrivire sau o
variabilă în paranteză (expresie de potrivire). Rezultatul acestei expresii de potrivire sau a unei variabile
va fi testat în funcție de condițiile specificate în case, în interiorul acoladelor {}. Un case trebuie
specificat cu o valoare constantă unică și se încheie cu două puncte : . Fiecare caz (case) include una
sau mai multe declarații care trebuie executate. Case-ul va fi executat dacă valoarea unei expresii /
variabile de potrivire sunt egale.
La sfărșitul fiecărui bloc de case, trebuie plasat unul din operatorii Break. Atunci, când se va utiliza
break, alte case-ri nu se vor executa. Dar, în cazul în care doriți după un case să se execute alt bloc,
atunci putem folosi și alte instrucțiuni goto,return.
În exemplul de mai jos este declarată o variabilă de tip String a cărei valoare va fi citită de tastatură. În
switch vom indica valoarea care va fi comparată cu cea din case. Dacă corespund se va afișa blocul
case-lui respectiv, în caz contrar se va afișa default:
Mai jos este prezentat un exemplu de utilizare a instrucțiunii goto. Face posibilă trecearea de la un
case direct la următorul menționat.Adică se va afișa ceea ce este în case1, apoi case 4.
Instrucțiunea for
Bucla for execută în mod repetat un bloc de instrucțiuni până când condiția specificată returnează
fals .
Bucla for conține trei parametri opționale separate printr-un punct și virgulă:
Instrucțiunea Foreach()
În exemplul de mai jos avem declarat o matrice, trebuie să afișăm lungimea acestei matrice, pentru
aceasta vom utiliza for().
Sintaxa :
De exemplu, un semafor are trei stări: lumină verde, lumină galbenă și lumină roșie. Este
posibil să simulați semafoarele cu o clasă. Cu toate acestea, este mai bine să folosim
enumerarea atunci când nu este nevoie să complicăm lucrurile. În primul rând, să aruncăm o
privire asupra sintaxei. Cum se declară? Poate fi într-un fișier separat,la fel cum am făcut cu
clasele. Aici folosim cuvântul cheie enum. Apoi, listăm stările separîndule prin virgulă.
De fapt, fiecare valoare de enumerare are un număr asociativ. Dacă nu este specificat, atunci
este implicit și începe de la zero. Implicit, orice enumerare moștenește de la int. Dacă vom scri
același lucrul în felul următor, nimic nu se va schimba.
Acest lucru, pur și simplu ne este ascuns dacă nu-l indicăm. Dacă scriem explicit valorile,
atunci le putem modifica, de exemplu - 3, 24, 7. Ele sunt asociate doar cu sterile respective.
Spre deosebire de clase, valoarea din enumerări este mai sigură. O enumerare este un tip mai
strict. Când, în cod utilizator, transmitem o valoare variabilelor de tip TrafficLight, chiar și
IntelliSense ni se oferă o valoare pentru o anumită variabilă, ceea ce crește securitatea utilizării
acestui tip.
Când creăm o metodă de aprindere pentru o anumită culoare, putem utiliza această valoare și
ca număr întreg pentru a seta luminozitatea. Să creăm o clasă TL care are o metodă LightOn
care acceptă argumente de tipul TrafficLight. Să folosim valorile implicite pentru a seta
luminozitatea.
În clasa Program , vom crea obiect nou care va apela metoda LightOn():
Rezultat obținut:
Un alt exemplu este, afișarea numărului de ordine a luni utilizând tipul de dat enum:
Rezultatul obținut:
COLECȚIE LIST
Listele din C# sunt foarte asemănătoare listelor din Java. O listă reprezintă un obiect care deține o
variabilă într-o ordine specifică. Și poate să conțină doar o singură pereche de valori. Tipul de
variabilă pe care lista îl poate stoca este definit utilizând sintaxa listei. Atunci cînd utilizăm listele,
este important să importăm un spațiu ne nume(namespace) în proiectul nostru. Clasa generică este
definite în spațiul de nume rezervat System.Collections.Generic.
Sintaxa generală:
List <tip de date> nume_variabila = new List < tip de date> ();
Iată un exemplu de definire a unei liste numite numbers care conține numere întregi.
Tablourile au un mare dezavantaj și anume că dimensiunea matriciei este statică. După crearea și
inițializarea sa, lungimea matricei nu poate fi modificată. Puteți crea doar una nouă și puteți copia
elemente din vechea matrice de acolo. Dar de fapt, există un tip pentru aceasta numit List. Și
acesta poate fi extins dinamic. În interiorul acestuia vom găsi un tablou obișnuit. Dar, atunci când
adăugați un alt element, dacă toate elementele matricei deja sunt utilizate, atunci aceasta creează
una nouă cu lungimea de două ori mai mare și copiază toate elementele acolo. Apoi, în consecință,
adaugă la următorul index, elementul pe care doriți să îl adăugați. 2
Să creăm următorul exemplu: Aici, lista poate fi creată de orice tip, și este specificat în
simbolurile <tip>. În cazul dat, Lista este de tip <int>, și am atribuit valori numerice. Pentru
afișarea tuturor elementelor listei, vom utiliza foreach();
În rezultat vom obține toate elementele listei declarate:
Metoda Add(); -- Permite să adăugați un element nou, fără ca să accesați indexul care i-ar
corespunde, trebuie doar să apelăm această metodă Add (). În exemplul de mai jos, noi adăugăm
elemente noi la lista noastră și afișăm rezultatul obținut:
Rezultat:
Aici, Add(); nu returnează o listă nouă. O modifică pe cea existentă, asupra căreia s-a apelat această
metodă. În mod implicit, lista alocă intern o matrice de tipul specificat în < >, inițial cu o
dimensiune de 4 elemente. În acest caz, deoarece l-am inițializat deja, poate fi 8 sau 16, în
dependență de numărul de elemente deja inițializate. Când adăugăm încă 9 elemente, noi îl vom
umple. Când adăugați al 10-lea, lista va vedea că dimensiunea dată nu este suficientă, va crea o
nouă matrice de două ori mai lungă. Aici putem observa că lungimile matricilor sunt dublate de
fiecare dată.
Metoda AddRange();
De asemenea, puteți adăuga o altă matrice în loc să adăugați elemente unice. Pentru aceasta, apelați
metoda AddRange (). În exemplul, de mai jos adăugăm o matrice de valori și afișăm rezultatul
obținut.
Rezultatul :
Metoda Remove();
Colecția generică de liste are o metodă Remove. Această metodă returnează o valoare booleană.
Dacă găsește elementul dat și îl elimină, se întoarce valoarea de adevăr, dar dacă nu găsește
elementul dat, se întoarce false. Când o găsește, șterge doar prima găsită, în acest caz doar primul
element de 1, pe al doilea nu-l va șterge. Pentru claritate, în exemplul următor îl includem într-un
if:
Rezultat:
Metoda RemoveAt();
De asemenea, poate fi eliminat nu doar elementul a cărui valoare există. Dacă, de exemplu, se
cunoaște indexul elementului care trebuie eliminat, puteți apela RemoveAt() și îi puteți transmite
indexul.
Rezultat:
Metoda Reverse();
Aceasta indică faptul că list este de tip indexat. Prin urmare, puteți face referire la index la fel ca
în cazul matricelor. Lista acceptă metoda Reverse(), aceasta inversează poziția elementelor în
ordinea de la capăt.
Rezultat;
De asemenea, Listele acceptă metoda Contains, cu care putem determina dacă un anumit element
se conține în listă. Această metodă returnează valori de True/False. În exemplul, de mai jos
verificăm dacă în lista noastră un anumit element, dacă se întîlnește atunci se va afișa True. Și
invers:
Rezultat :
Deoarece List este un tip indexat, înseamnă că putem lucra cu o buclă for. În loc de lungime, spre
deosebire de lucrul cu matrice, acesta are o proprietate Count care returnează numărul de elemente.
În următorul exemplu ne referim la index.
Rezultat:
În exemplul de mai jos, metoda Count(); va returna numărul de elemente care se află în lista
declarată:
Rezultat
În C# , Dicționarul este o colecție generică care este utilizată în general pentru a stoca perechi
de cheie/valoare. Dicționarul este definit în System.Collection.Generic namespace. Este dinamic
de la sine, ceea ce înseamnă că mărimea dicționarului se va mări după necesitate.
Clasa Dictionary are 7 constructori, care se folosesc pentru a crea un dicționar. În exemplu de mai
jos vom folosi:
Dictionary <TKey,TValue>() acest constructor este utilizat pentru a crea o instanță a clasei
Dictionary, care este gol.
Pentru a adăuga elemente noi într-un dicționar putem utiliza mai multe metode:
În paranteze <> noi indicăm două tipuri: tipul cheiei(aici el este int) și tipul valorii cu care
aceasta se asociază (string).
Remarcă! Nu puteți adăuga o cheie existentă. Adică, nu pot exista două chei identice în
dicționar. Cheile trebuie să fie unice. Când încercați să adăugați un duplicat va apărea o eroare.
Dicționarele nu sunt utile numai pentru că implementează de fapt semnificația matricilor
asociative, ci și pentru că lucrează foarte rapid atunci când se caută o valoare după cheie. Prin
urmare, atunci când cheia este cunoscută și cheile sunt ordonate în dicționare, este mai ușor să
găsiți valoarea după cheie. Aceasta este esența tipului Dictionary.
Cum se obține valoarea cu ajutorul cheie? Să folosim accesul după index. Mai degrabă acest
lucru este aparent, dar în realitate cheia este trecută între paranteze pătrate. Ideea este că sintaxele
sunt aceleași.
De asemenea, este posibil să parcurgem colecția de chei prin iterații. Pentru a face acest lucru, vom
folosi proprietatea Keys, adică chei. Tipul de date primit se numește KeyCollection. Este o clasă
componentă în dicționar și scrisă după cum urmează:
La fel, puteți repeta o colecție de valori. Pentru a face acest lucru, vom folosi proprietatea Values,
care returnează o colecție de valori.
Dar cel mai adesea, atunci când iterăm, nu folosim chei separate sau valori separate, ci perechi
cheie-valoare. Adică, de obicei, într-o buclă este necesar să aveți acces atât la cheia curentă, cât și
la valoarea curentă. Pentru a face acest lucru, puteți rula pur și simplu foreach pe însuși Dicționar:
Aici pair. are tipul KeyValuePair<int, string>, acesta reprezintă perechea cheie-valoare.
Dar, de obicei, se preferă o notare succintă a acestei expresii, este mai ușor în acest fel. De
asemenea, puteți interoga numărul de elemente din dicționar prin următoarea proprietate:
Această căutare cheie este foarte rapidă. Bineînțeles, puteți întreba dacă Dictionary conține o
anumită valoare. Căutarea prin intermediul unei valori este mult mai lentă. Funcționează ca o
căutare pe o matrice sau un list obișnuit. Adică, va itera secvențial peste toate elementele până
când îl va găsi pe cel dorit.
Prin urmare, Dictionary se folosește atunci când trebuie să extragem informații, adică valoare,
când știm cheia prin care extragem aceste informații. Să verificăm rezultatul unor astfel de
interogări
Dictionary vă permite să ștergeți o pereche cheie-valoare folosind doar cheia. Dacă cheia este
eliminată, atunci și valoarea asociată este eliminată. Rețineți că această metodă returnează o
valoare de tip Boolean
Dictionary mai are o altă metodă de adăugare TryAdd, care returnează și ea Boolean. Dacă
cheia este nouă, atunci returnează True, dar dacă o astfel de cheie a fost deja utilizată, returnează
False și nu adaugă nimic. Vom încerca să adăugăm o valoare utilizând o cheie existentă
Stack reprezintă o colecție de obicte “ultimul venit, primul plecat – last in, first out). Se
folosește atunci când aveți nevoie de accesa elementele aflate într-o coadă de așteptare sau
atunci când trebuie să modelăm un astfel de comportament – de exemplu, dacă trebuie să
păstrăm calea către poziția curentă într-o căutare recursivă. Utilizați o stivă atunci când trebuie
să implementați comportamentul „last in, first out” (LIFO). La fel face parte din spațiul rezervat
de nume Sustem.Collections.
Declarare Satck
Un Stack este creat cu ajutorul tipului StackData Type. Cuvântul new este utilizat pentru a
crea un obiect dintr-un Stack. Obiectul este apoi atribuit variabilei st;
1
Eliminarea unui element din Stack
Metoda Pop() este utilizată pentru a elimina un element din Stack. Aceasta va retuna cel mai
de sus element al Stack-lui.
Metoda Contains()
Această metodă este utilizată pentru a verifica dacă un element este prezent în Stack. Aceasta
returnează True or False.
Dacă doriți să verificați valoarea de sus a unui Stack, fără a o elimina, utilizați apelul la metoda
Peek() este asemănător cu metoda Pop , doar că Peek nu modifică mărimea Stack-ul :
Mai jos, este prezentat exemple de utilizare a unui Stack. La declarare este asemănătoare
cu lista:
2
Pentru a adăuga elemente noi în Stack, vom utiliza metoda Push()
Pentru a afișa cel mai de sus element din Stack, vom utiliza metoda Peek();
Când apelați Pop(), elementul din partea superioară a Stack-ului este returnat, iar apoi este
eliminat din colecție.
Pentru a verifica dacă există un anumit element în Stack vom utiliza Metoda Contains() a
Stivei care va returna adevărat (True) dacă elementul este găsit:
3
QUEUE
Coada este o colecție specială de cazuri , care reprezintă conceptul de primul venit, primul
servit (FIFO). În mod normal, prima persoană care intră în coadă va fi prima persoană care
va intra în autobuz. În mod similar, ultima persoană care intră în coadă va fi ultima persoană
care intră în autobuz. Elementele sunt adăugate la coadă, una peste alta.
Declarația queue
O coadă este creată cu ajutorul tipului de date data QueueData Type. Cuvântul cheie „new”
este utilizat pentru a crea un obiect al unei cozi. Obiectul este apoi atribuit variabilei qt.
Metoda enqueue(); este utilizată pentru a adăuga un element în coadă. Sintaxa generală a
enunțului este dată mai jos.
Metoda dequeuer() este utilizată pentru a elimina un element din coadă. Operația de coadă va
returna, primul element al cozii. Sintaxa generală
4
Metoda Count()
Această proprietate este utilizată pentru a obține numărul elemente din coadă. Mai jos este
sintaxa generală
Metoda Contains()
Această metodă este utilizată pentru a vedea dacă un element este prezent în coadă. Mai jos
este sintaxa generală
Instrucțiunea va returna adevărată dacă elementul există, altfel va returna valoarea falsă.
Mai jos, este prezentat exemple de utilizare a metodelor în coadă: Vom declara un Queue
și vom adăuga elemente noi în coadă:
După aceea, vom utiliza metoda Dequeue(); Aceasta va șterge primul element al cozii:
5
Afișarea elementului din coadă:
Principiul de functionare
6
7
LinkedList
LinkedList<T>; reprezintă o listă dublă legată, în care fiecare element stochează simultan un
link către elementul următor și cel anterior.
Declarare:
Metodele utilizate :
RemoveFirst (): elimină primul nod din listă. După aceea, noul prim nod devine nodul următor
celui șters.
1. Declarați un LinkedList care va conține toate lunile anului, aplica-ți toate metodele:
De adăugare, ștergere, verificare. Afașați rezultatele.
2. Delarați un LinkedList care va conține diferite tipuri de animale. Aplicațile cele mai
uzuale metode de adăugare,ștergere,verificare. Afișați rezultatele.
CLASE C#
După, cum știm, C# este un limbaj pur orientat pe obiecte, care oferă posibilitatea de a reutiliza
codul existent. C# oferă și alte concepte orientate pe obiecte pentru a îndeplini cerințele reale
ale companiilor.
Ce este o clasă?
Clase reprezintă niște tipuri de date definite de către utilizator și care va reprezenta
comportamentul și starea unui obiect. Starea va reprezinta proprietățile, iar comportamentul
este acțiunea pe care o poate efectua obiectele. Obiect nu este altceva decât o componentă ce
constă din metode și proprietăți pentru a face utile datele. Clasele pot fi declarate folosind
următorii specificatori de acces care limitează accesibilitatea claselor la alte clase, însă unele
clase nu necesită niciun modificator de acces.
Modificatori de acces sunt concepte de programare care pot modifica nivelul de acces al unor
elemente. Cu alte cuvinte, sunt cuvinte cheie rezervate care adaugă informații pentru
compilator și bucata de cod aferentă modificatorilor respectivi.
La început există un modificator de acces, iar după cuvântul cheie al clasei, numele clasei în
acolade, este corpul clasei, care poate conține câmpuri,proprietăți,metode , etc.
CREAREA UNUI PROIECT CLASE
Creați un proiect nou, face-ți click dreapta pe Clase în C#, adăugăm o clasă nouă:
Apoi , într-un fișier aparte creat(ClassNumeClass) vom declara : două variabile de tip
string message unde s-a atribuit o valoare (Welcome in POO C#) și o variabilă de tip integer
numbers unde s-a atribuit o valoare (2021). Pentru a afișare , vom utiliza propria funcție
afisare();.
Rezultatul așteptat :
Metoda GetInfo(); această metodă permite afișarea la consolă. Și vom obține acelaș rezultat.
CONSTRUCTOR
Constructorul este o metodă care face parte din corpul unei clase. Corpul constructorului este
format din instrucţiuni care se execută la crearea unui nou obiect al clasei respective (sau la
crearea clasei, în cazul constructorilor cu modificatorul static).
pot exista mai mulţi constructori care se pot diferenţia prin lista lor de parametri.
constructorii nu pot fi moşteniţi.
dacă o clasă nu are definit niciun constructor, se va asigna automat constructorul fără
parametri al clasei de bază.
Constructorul are același nume cu cel al clasei.Sarcina constructorului este aceea de a inițializa
memoria alocată pentru obiect, unde vor fi stocate câmpurile sale.
Declararea constructorului:
În exemplul de mai jos este declarat o clasă care conține un constructor cu parametru.
Constructor cu parametru
Un constructor care are cel puțin un parametru se numește constructor cu parametru. Folosind
acest tip de constructor, putem inițializa fiecare instanță a clasei cu valori diferite.
Rezultat așteptat:
Un alt exemplu de utilizare a constructorului cu parametru:
Rezultatul așteptat:
DESTRUCTORI
Destructorii sunt metode speciale care au rolul de a distruge obiectele. A ”distruge” un obiect
înseamnă a elibera memoria pe care el o ocupă. Sintaxa pentru un destructor este:
Moștenirea este un concept important al C#. Moștenirea este un concept în care definiți clasele
părinte și clasele copil. Clasele copil moștenesc metode și proprietăți ale clasei părinte, dar, în
același timp, pot modifica și comportamentul metodelor, dacă este necesar. Clasa copil poate
defini și metode proprii, dacă este necesar. O clasă care este moştenită se numeşte clasă de
bază sau superclasă, iar o clasă care o moşteneşte pe aceasta se numeşte clasă derivată, sau
subclasă, sau clasă descendentă.
O clasă derivată poate la rândul ei să fie clasă de bază pentru o altă clasă. În acest fel se poate
defini noţiunea de ierarhie de clase. Limbajul C#, spre deosebire de C++, admite doar
moştenirea simplă, în sensul că derivarea se admite doar dintr-o clasă de bază, fiind permisă
doar derivarea publică.
În exemplul de mai jos este declarant o clasă de bază(părinte) Muzician, care își are o metodă
proprie Cântă Apoi, declarăm două clase Violonist, Pianist care la rândul său își au metodele
sale pe lângă cele moștenite.
În clasa Program , vom crea trei obiecte noi și vom apela metodele declarate.
Rezultatul obținut:
ÎNCAPSULARE(Encapsulation)
Încapsularea este definită ca procesul de includere a unuia sau mai multor elemente într-un
pachet fizic sau logic. Încapsularea în metodologia de programare orientată pe obiecte
împiedică accesul la detaliile implementării. Încapsularea este implementată folosind
specificatorii de acces. Un specificator de acces definește domeniul de aplicare al unui membru
al clasei, adică acele cuvinte cheie care dictează din ce nivel poți avea acces la un anumit câmp.
Acest ”din ce nivel” se referă la: din interiorul clasei (adică de la un obiect al clasei respective,
caz în care modificatorul de acces se numește private); de la obiectele claselor derivate, de
oriunde din cadrul aplicației – modificator public, etc.
O proprietate este un membru care oferă un mecanism flexibil pentru citirea, scrierea sau
calcularea valorii unui câmp privat. Proprietățile pot fi folosite ca și cum ar fi membri de date
publice, dar sunt de fapt metode speciale numite accesori (accessors). Get și set și sunt numiți
accesori.
Sunt metode speciale care: returnează valoarea câmpului privat (get(numit și getter), stabilește
valoarea câmpului privat(set(numit și setter).
Deci accesorii se apelează în funcție de modul în care este utilizată proprietatea. value este o
variabilă care reține valoarea pe care trebuie să o atribuim câmpului privat. Mai exact, atunci
când utilizăm proprietatea într-o manieră set.
În exemplul de mai jos vom utiliza încapsularea folosind proprietățile: Am declarat o clasă
Employee are un câmp privat, denumit salary, care evident nu poate fi accesat cu ajutorul
obiectului, întrucât este declarat private. De aceea, am declarat proprietatea SALARY care
îndeplinește o sarcină. Accesorii se apelează în funcție de modul în care este utilizată
proprietatea. Este declarat Set , value este o variabilă care reține valoarea pe care trebuie să o
atribuim câmpului privat. Get, return returnează o valoare care îi este oferită.
În clasa Program, vom declara un obiect nou al clasei Employee , denumit obiect după care
alocăm memorie pentru el , cu ajutorul operatorului new. Cu ajutorul operatorului (.) punct,
vom accesa direct de câtre obiect, și atribuim valoare.Afișarea rezultatului, utilizând
Console.WriteLine().
Rezultatul obținut:
DELEGAȚI
O delegare reprezintă un tip de date de tip referință care execută metode având același
format (același tip rezultat și același număr și tip de parametrii). Delegările se declară în
interiorul sau afara claselor, practic, ar trebui declarat în afara clasei, cu ajutorul cuvântului
cheie delegate, și nu au corp!
Mai jos, declarăm un delegate cu numele PreaRepede cu un parametrul de tip int. După
declararea unui delegat trebuie să setăm o metodă țintă.Care va avea ca și delegatul acelaș tip
de parametrii.
În mod obișnuit, dacă nivelul superior în sine preia controlul asupra unui astfel de
comportament, aici trebuie să porniți un fel de buclă while și să verificați periodic, la ce viteză
este. Noi, ca utilizatori Car, nu știm la ce viteză este atunci când apelăm metoda Accelerare(),
deci această metodă nu este potrivită. Avem nevoie doar de notificări de la nivelul inferior
precum că am accelerat prea mult și este suficient, să nu mai apelăm Accelerare(). Și acest
lucru se poate face folosind așa-numitul DELEGAT. Să presupunem că vrem la nivelul
superior, dacă am accelerat prea mult, să oprim mașina apelând metoda Stop().
Pentru a implementa acest comportament, ambele părți, nivelul superior și cel inferior,
trebuie să interacționeze cumva. Nivelul inferior trebuie să declare o semnătură de metodă care
ar putea fi utilizată pentru a gestiona acest eveniment atunci când viteza este prea mare. Pentru
aceasta este utilizat cuvântul cheie delegate. Acest delegat descrie metoda cu care codul extern
poate gestiona acest eveniment.
Deoarece doar am declarat tipul, ar trebui să creăm o instanță și să facem câmpul acestui
delegat:
În continuare vom oferi nivelului celui mai înalt posibilitatea de a se asigna evenimentul. Să
creăm o metodă care să accepte un argument de tipul PreaRepede(), care este un tip delegat.
Se pare că aici descriem interacțiunea dintre Car și nivelul superior. Nivelul superior se
înregistrează și se asignează la evenimentele definite de delegatul PreaRepede(). Descrie o
anumită semnătură, iar această semnătură trebuie să fie urmată de un gestionar de evenimente
(handler) care va avea loc.
Acest handler îl vom apela în metoda Accelerare().
Dacă această metodă spune că el are nevoie de un anumit parametru care nu este, atunci vom
primi o eroare de compilare deoarece această metodă nu se potrivește cu semnătura delegatului.
În acest caz, este necesar să declarați delegatul în corespundere. De adăugat un parametru de
tip int. Și atunci când apelăm delegatul, trebuie să îi transmitem și un argument:
El însuși nu este apelat în codul clientului, este trecut doar la nivelul inferior, obiectului car,
prin intermediul unui delegat.
Rezultatul :
O altă situație în care poate fi utlizat delegatul este un cod de program care face diferite operații
matematici cu valori declarate:
Deci, declarăm un delegat operation, care acceptă la intrare doi parametrii de tip int și
returnează la fel tipul de dat int.
Observați că atât AddNum() cât și MultiNum() acceptă doi parametri întregi și returnează un
întreg, la fel ca declarația pentru delegatul operation.
Acum, în metoda statică void Main(), putem instanția delegatul și îl putem indica către oricare
dintre aceste două metode.
Aici , am declarat o nouă variabilă op de tip operation și i-am atribuit o metodă, AddNum();
Apoi, facem referire la op la fel cum am face referire la metoda AddNum(). Îi transmitem doi
parametri.
Rezultat:
Modificați programul de mai sus în așa fel , încât să afișați operațiile de (*,/,-) pentru valorile
dorite.
Unde pot fi folosiți Delegații?
Delegații sunt instrumente puternice pentru extinderea codului existent. După cum
puteți vedea în exemplele de mai sus, ele pot fi folosite pentru a apela o metodă fără
cunoașterea prealabilă a numelui actual al metodei sau chiar fără cunoașterea clasei în
care se află metoda. Deoarece vă permit să treceți în mod transparent metode între clase,
le puteți folosi și pentru a scrie apeluri și a gestiona evenimente.
Delegații sunt utili în programele cu interfețe de utilizator non-triviale, cum ar fi
aplicațiile WPF, în care trebuie să transmiteți o anumită valoare de la un proces back-
end la firul de execuție UI. Un delegat poate fi folosit în acest scenariu pentru a trimite
mesajul sau valoarea înapoi în firul de execuție a interfeței de utilizare fără a încălca
principiile standard de codare.
Cuvântul cheie THIS
Este folosit pentru a diferenția între parametrii metodei și câmpurile de clasă dacă
ambele au același nume. Cînd o metodă este apelată, automat i se transmite o referință pentru
către obiectul care o apelează. Această referință este numită this. De cele mai multe ori this se
referă la obiectul cu care metoda lucrează.
Un caz de utilizare în care este utilizat cuvântul cheie this. Și constă în faptul că uneori avem
nevoie să rezolvăm coliziunile (ambiguitățile) de nume în constructorul și metodele unei clase.
Ce ambiguități poate fi, de exemplu, o metodă sau un constructor poate avea un argument cu
un nume care se potrivește cu numele unui câmp din clasă.
Ca rezultat, nu vom obține nimic bun, deoarece în singura linie de lucru a corpului
constructorului, de fapt, valoarea argumentului „price” este atribuită aceluiași argument „price”
și nu câmpului de clasă cu acest nume!
Aici cuvântul cheie this ne va ajuta, în acest caz, va denota un link către însuși obiectul cu care
funcționează sistemul. Acum, de fapt atribuim valoarea argumentului câmpului de clasă
Rezultat
Ma jos, este prezentat un alt exemplu când un câmp al unei clase clase se potrivește cu numele
unei variabile dintr-o metodă.
Rezultat:
ABSTRACTIZAREA
Sintaxa:
Aceasta este clasa de bază abstractă, dacă sunt ambele metode abstracte, atunci aceasta clasă ar deveni
o clasă abstractă de bază. Acum, vom declara o clasă nouă class Cat care va moșteni de la clasa
Animal.
Aici noi vedem clasa Cat care provine de la clasa Animal . Vedem că sunt 2 metode în clasa abstractă,
metoda eat() nu are implementare, de accea el este declarant ca abstract , în acest timp metoda sound()
are propriu corp si deaceea nu este declarată abstract. În main() am creat un obiect cat al clasei Cat. Și
am apelat metodele clasei.
Rezultatul obținut:
Abstractizarea este necesară atunci când trebuie să moștenim doar dintr-o anumită clasă, dar nu trebuie
să instanțiem obiectele din acea clasă.
Proprietăți abstracte
Proprietatea folosește set și get pentru a seta și extrage valorile unui câmp, chiar dacă este considerată
o metodă specială, ea la rândul său poate fi abstractă. Dacă clasa este abstractă, atunci și proprietatea
va fi declarată abstractă .
Mai jos este prezentat un exemplu de utilizare a unei proprietăți abstracte. Avem declarat o clasă
Employee cu două proprietăți abstracte.
Clasa Programmer este extinsă de la Employee și implementează proprietățile abstracte declarate în
Employee.
Apoi, creem un constructor cu parametru și o metodă de afișare.În main vom crea un obiect pentru clasa
moștenitoare, apelăm metodele clasei.
Rezultat obținut
Un alt exemplu este clasa Employee abstractă al cărei obiect nu poate fi creat și nici nu are rost,
deoarece fiecare angajat va fii o sub-deviziune specific – un programator, un contabil,un manager ș.a.
În clasa abstractă va fi declarat și metode,proprietăți abstracte.
Apoi, declarăm clasa Programmer care vor moșteni de la clasa Employee. Va conține un constructor cu
parametru și o metodă de afișare.
O alta clasa care va moșteni de la Employee, clasa Manager la fel va conține implementarea metodelor
abstracte.
Drept urmare, încă lucrăm cu o listă de angajați și apelăm metoda GetInfo(), vom obține informații
despre anagajatul corespunzător.
Rezultat obținut
TEHNOLOGIA LINQ
Language Integrated Query permite interogarea unor seturi de obiecte prin invocarea unor
metode care “oglindesc” funcționalitatea SQL. LINQ permite accesarea unor tehnologii pe
care un dezvoltator nu le putea accesa sau le accesa dar foarte greu. LINQ extinde limbajul prin
adăugarea de expresii de interogare, care sunt similare cu instrucțiunile SQL. Expresiile de
interogare LINQ pot fi utilizate pentru a extrage și procesa în mod convenabil date din array,
colecții generice, baze de date relaționale și alte surse de date terțe.
Principalul concept al LINQ este de a oferi facilitatea limbajelor .NET (cum ar fi C #, VB.NET,
etc.) pentru a construi interogări pentru a recupera date de la sursa de date. Pentru a prelua
datele din diverse formate și surse din C # și VB.NET, sintaxa de interogare uniformă a
acesteia. Acesta elimină variația dintre bazele de date și limbajele de programare, deoarece s-
a integrat cu C # / VB și, de asemenea, a furnizat interfața de interogare distinctă pentru diferite
tipuri de surse de date. Aceasta permite utilizarea unei abordări orientate pe obiect pe setul de
rezultate; interogările rezultate returnează rezultatele ca obiecte.
Diferența dintre SQL și LINQ este aceea în care (query Language Integrated) este sintaxa de
interogare structurată care a încorporat VB.NET și C # pentru a prelua datele din diferite tipuri
de surse de date, care include MS SQL Server, ADO.Net DataSet, serviciu web, Colecții,
Documente XML și alte baze de date. În același mod, SQL este un limbaj de interogare
structurat, care este utilizat pentru a stoca și recupera datele dintr-o bază de date.
LINQ to Object
Prin utilizarea LINQ dezvoltatorii pot fi ușor ușor de înțeles și de înțeles din cauza codului său
mai lizibil. În LINQ va există o sintaxă uniformă pentru interogarea mai multor surse de date.
În timpul compilării, LINQ oferă verificarea tipului obiectelor. Acesta susține și conturarea
datelor, putem prelua date sub diferite forme.
De ce ar trebui să folosim LINQ.În timpul perioadei de rulare, ajută la găsirea erorilor, astfel
încât să putem elimina sau corecta cu ușurință erorile și, de asemenea, oferă o verificare în timp
ce este compilat. În interogarea Language Integrated nu este necesară învățarea diferitelor tipuri
de limbaje, deoarece o interogare distinctă poate funcționa cu orice tip de bază de date. De
asemenea, acceptă orice fel de sursă de date cum ar fi obiecte, XML, Entități, SQL ș.a. Este
creat pentru a încărca diferența dintre .NET convențional, care prezintă o abordare orientată pe
obiect și o abordare puternică de tastare. Language Integrated Query a introdus un model ușor
de învățat pentru modificarea și interogarea datelor și, de asemenea, acceptă surse de date care
includ XML, structuri de date în memorie și date relaționale. Este o expresie puternic tipificată.
Sintaxa interogării LINQ
SELECT *
FROM TABLE
În LINQ, interogarea se face astfel:
from s in Table
select s
Pentru a crea o interogare LINQ este nevoie să ținem cont de următoarele:
Vom construi un exemplu, în care vom folosi LINQ pentru interogarea rapidă a unei surse de
date.
Exemplu de declarare a unei liste si am dori să aflăm care sunt elementele care conține
combinația de cuvinte(“Py”) vom scrie următoarele:
După cum putem observa interogarea LINQ este foarte asemănătoare cu o interogare SQL.
Operatorul from se folosește pentru a specifica sursa de date, where specifică condiția de
filtrare, iar select selectează elementul.
LISTA METODELOR UTILIZATE DE LINQ
WHERE
Operatorul where se folosește pentru filtrarea datelor de ieșire asemănător cu cel din SQL.
Pentru clauze mai sofisticate este obligatoriu a se folosi varianta cu invocarea metodei,
deoarece în query expression nu se pot defini decât filtre simple.
ORDERBY si ORDERBYDESCENDING
Exemplu:
REVERSE
Returneaza lista de rezultate în ordinea inversă (ultimul item devine primul). Nu poate fi folosit
ca și query expression ci doar sub forma de invocare explicită a metodei.
Exemplu:
GROUPBY
Exemplu:
DISTINCT
Se folosește atunci când dorim să evităm înregistrările duplicate. Nu poate fi folosit ca și query
expression ci doar sub forma de invocare explicită a metodei.
Exemplu:
COUNT
Metoda Linq Count folosită pentru a returna numărul de elemente prezente în colecție sau
numărul de elemente care au îndeplinit o anumită condiție.
Exemplu:
SUM
Linq Sum(); în C# este utilizată pentru a calcula totalul sau suma valorilor numerice din
colecție.
Exemplu:
MIN si MAX
Se folosesc pentru determinarea valorilor minime sau maxime dintr-un sir de valori.
Exemplu:
AVERAGE Se folosește pentru calcularea mediei aritmetice. Se poate aplica peste tipurile
numerice. Dacă valoarea calculată este mai mare decât maximul tipului rezultat, atunci se va
arunca o excepție de forma OverflowException.
Exemplu:
ANY Operatorul returnează true dacă măcar un element se găsește în sursă și false dacă
secvența sursa este goală. Pentru optimizarea execuției returnează o valoare imediat ce un
rezultat este disponibil.
ALL Operatorul returnează true dacă toate elementele din sursa specificată îndeplinesc condiția. Dacă
sursa specificată nu conține nici un element atunci ALL va returna false;
CONTAINS Operatorul returnează true dacă sursa specifică conține elementul primit ca parametru și
false dacă nu conține. În cazul LINQ for Objects încearcă apelarea metodei Contains dacă tipul primit
ca parametru implementează interfața ICollection. Dacă nu, atunci va compara cu ajutorul
comparatorului specificat ca parametru.
TAKE Primește ca parametru o secvență de elemente și count . Returnează primele count elemente din
secvență. Dacă count are valoare negativă atunci rezultatul va fi gol.