Sunteți pe pagina 1din 100

Introducere în .

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.),

un set de medii de dezvoltare (Visual Studio)

o bibliotecă de clase pentru crearea serviciilor Web, aplicațiilor Web


și aplicațiilor desktop Windows.
Prezentare
Componentele de bază ale .NET Framework
Common Language Runtime (CLR): CLR este o componentă a .NET Framework. Este responsabil cu
managementul și execuția codului scris în limbajele .NET, aflat în format IL. CLR instanțiază
obiectele, depune obiectele în memorie, disponibilizează memoria prin garbage collection.În urma
compilării unei aplicații rezultă un fișier cu extensia .exe, dar care nu este un executabil portabil
Windows dar un executabil .NET. Deci acest cod se va rula de către CLR. CLR folosește tehnologia
compilării JIT o implementare de mașină virtuală, în care o metodă sau o funcție, în momentul în
care este apelată pentru prima oară, este tradusă în cod mașină. Sensul unui compilator JIT este
destinată pentru a îmbunătăți performanța execuției, și anume odată ce a fost compilat se execută
pe diverse procesoare,dacă mașina virtuală este bine adaptată la noua platformă atunci acest cod
va beneficia de toate optimizările posibile, fără a mai fi nevoie recompilarea lui
Framework Class Library (FCL): Aceasta este o colecție de
biblioteci de clasă, metode etc., care pot fi reutilizabile, care
pot fi integrate cu CLR. Numite și ansambluri. Acest lucru
este similar cu fișierele antet din C / C ++ și pachetele în
Java. Instalarea cadrului .NET înseamnă în esență instalarea
CLR și FCL pe sistem.
Prezentare
Platforma cadru de aplicații .NET este dependentă sau
independentă de platformă?

Combinația dintre arhitectura sistemului de operare și arhitectura


procesorului este cunoscută sub numele de platformă. Dependența de
platformă înseamnă că codul limbajului de programare va funcționa
numai pe un sistem de operare specific. O aplicație .NET depinde de
platformă, deoarece .NET poate rula doar pe un sistem de operare
bazat pe Windows. Aplicația .net este independentă de platformă.
.NET Framework
Componenta .NET Framework stă la baza tehnologiei .NET, este ultima

interfață între aplicațiile .NET și sistemul de operare și actualmente conține:

Limbajele C#, VB.NET, C++ș.a. Pentru a fi integrate în platforma .NET toate

aceste limbaje respectã niște specificații OOP numite Common Type System

(CTS). Ele au ca elemente de bază: clase, interfețe, delegări, tipuri valoare și

referință, iar ca mecanisme: moștenire, polimorfism și tratarea excepțiilor.

Platforma comună de executare a programelor numită Common Language

Runtime (CLR), CTS face parte din CLR.


Arhitectura .NET Framework
Ansamblul de biblioteci necesare în realizarea

aplicațiilor desktop sau Web numit Framework Class

Library (FCL). Componenta .NET Framework este

formată din compilatoare, biblioteci și alte

executabile utile în rularea aplicațiilor .NET.

Fișierele corespunzătoare se aflã, în general, în

directorul

C:\WINDOWS\Microsoft.NET\Framework\V2.0….

(corespunzãtor versiunii instalate)

MICROSOFT VISUAL STUDIO 2019


Compilarea programelor
Un program scris într-unul dintre limbajele .NET conform Common Language Specification (CLS)
este compilat în Microsoft Intermediate Language (MSIL sau IL). Codul astfel obținut are
extensia .exe, dar nu este direct executabil, ci respectă formatul unic MSIL. CLR include o mașină
virtuală asemănătoare cu o mașină Java, ce execută instrucțiunile IL rezultate în urma compilării.
Mașina folosește un compilator special JIT (Just In Time). Compilatorul JIT analizeazã codul IL
corespunzãtor apelului unei metode și produce codul mașină adecvat și eficient. El recunoaște
secvențele de cod pentru care s-a obținut deja codul mașinã adecvat permițând reutilizarea
acestuia fără recompilare, ceea ce face ca, pe parcursul rulării, aplicațiile .NET să fie din ce în ce
mai rapide. Faptul că programul IL produs de diferitele limbaje este foarte asemănător are ca
rezultat interoperabilitatea între aceste limbaje. Astfel, clasele și obiectele create într-un limbaj
specific .NET pot fi utilizate cu succes în altul.
Compilarea programelor
În plus, CLR se ocupă de gestionarea automată a memoriei (un
mecanism implementat în platforma .NET fiind acela de eliberare
automată a zonelor de memorie asociate unor date devenite inutile –
Garbage Collection). Ca un element de portabilitate, trebuie spus că
.NET Framework este implementarea unui standard numit Common
Language Infrastructure, ceea ce permite rularea aplicațiilor .NET, în
afară de Windows, și pe unele tipuri de Unix, Linux, Solaris, Mac OS
X și alte sisteme de operare.
De ce am alege .NET?
În primul rând pentru că ne oferă instrumente pe care le putem folosi și în
alte programe, oferă acces ușor la baze de date, permite realizarea
desenelor sau a altor elemente grafice. Spațiul de nume System Windows
Forms conține instrumente (controale) ce permit implementarea
elementelor interfeței grafice cu utilizatorul. Folosind aceste controale,
puteți proiecta și dezvolta rapid și interactiv, elementele interfeței
grafice. Tot .NET vă oferă clase care efectuează majoritatea sarcinilor
uzuale cu care se confruntă programele și care plictisesc și fură timpul
programatorilor, reducând astfel timpul necesar dezvoltării aplicațiilor.
INTRODUCERE ÎN C#

Limbajul C# este un limbaj de programare orientat pe obiecte OOP și a fost dezvoltat de o


echipă restrânsă de ingineri de la Microsoft. El permite programarea structurată, modulară şi
orientată obiectual. Principiile de bază ale programării orientate pe obiecte (ÎNCAPSULARE,
MOŞTENIRE, POLIMORFISM) sunt elemente fundamentale ale programării C#. În mare parte
, limbajul moşteneşte sintaxa şi principiile de programare din C++. Sunt o serie de tipuri noi
de date sau funcţiuni diferite ale datelor din C++, unele funcţiuni au fost adăugate (de exemplu,
interfeţe şi delegări), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate
(moştenirea multiplă şi pointerii către funcţii). Unele funcţiuni (cum ar fi accesul direct la
memorie folosind pointeri) au fost păstrate, dar secvenţele de cod corespunzătoare se consider
„nesigure”.

Structura unui program C#

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 3: spaţiul nostru de nume

linia 5: orice program C# este alcătuit din una sau mai multe clase

linia 7: metoda Main, „punctul de intrare” în program

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

Limbajul C# admite trei tipuri de 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.

 creare document în format XML folosind ///. Nepropunându-ne să intrăm în amănunte,


amintim că XML (eXtensible Markup Language) a fost proiectat în scopul transferului
de date între aplicaţii pe Internet, fiind un model de stocare a datelor nestructurate şi
semi-structurate.
Nume

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 @;

Convenţii pentru nume:

 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ă.

Simbolurile lexicale reprezentând constante, regulile de formare a expresiilor, separatorii de


liste, delimitatorii de instrucţiuni, de blocuri de instrucţiuni, de şiruri decaractere etc. sunt în
mare aceiaşi ca şi în cazul limbajului C++.
VARIABILE

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:

unde valoarea reprezintă valoarea atribuită variabilei nume_variabilă . După definirea


variabilei, puteți atribui o anumită valoare:

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:

o Am declarat o variabilă x de tipul de date integer.Apoi utilizînd funcția


Console.WriteLine(); am afișat un text dorit.
o Variabilei x i s-a atribuit funcția de convertire ToInt32, pentru a citi datele de la
tastatură. Acest lucru îl vom face cu ajutorul funcției Console.ReadLine();
o Dacă ați introdus codul corect atunci programul va funcționa și veți avea 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.

2. Tipul de date String


Acest tip de date este utilizat pentru a lucra cu valorile String. În C#, tipul de date este notat cu
cuvântul cheie String.

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.

3. Tipul de date Boolean


Acest tip de date este utilizat pentru a lucra cu valori booleene (true,false). În C# tipul de date
este notat prin cuvîntul cheie Bool. Mai jos este prezentat un exemplu de utilizare a acestui tip
de date.

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:

o Logice sau boolean;


o Întreg;
o Real sau fracționat;
o Simbolic , și stringuri, s.a.

Literali logice (booleene)

Î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:

Liteale detip caracter

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

Principiul de supraîncărcare constă în faptul că suprasolicitați dimensiunea unui spațiu de stocare a


acelei variabile. Mai jos, este prezentat un exemplu care constă în supraîncarcarea operatorului.

Observați ce rezultat ați obținut !


ZONA DE VIZIBILITATE A VARIABILEI

Zona de vizibilitate a variabilei se mai numește scope.

CE SE ÎNTÂMPLĂ DACĂ IEȘIM ÎN AFARA ULTIMELOR PARANTEZE?

Verificam modificarile codului


FORMATAREA ȘIRURILOR

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?

Compilatorul ne va da o eroare, deoarece nu va ști unde este sfârșitul șirului.

Pentru a le utiliza corect, trebuie să le ecranăm folosind „\”:

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.

Acum, să trecem la formatarea specializată care este acceptată de formatul string.

Î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:

Cerinte . La fel cu cifrele fracționare! si un exemplu care va produce rotunjirea.

De asemenea, formatarea funcționează pentru a invoca caractere speciale.

Î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:

Cerinte folosind interpolare șirurilor executati exact aceeași formatare!


COMPARAȚIE DE ȘIRURI

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.

Există, de fapt, diferite moduri de comparare a șirurilor.

Compararea prin operatorul ==, de fapt, este identică cu compararea string.Equals în regimul de
comparare Ordinal

Există 3 metode de comparație în total: CurrentCulture, InvariantCulture, Ordinal. Toate acestea


sunt completate cu o metodă de ignorare a cazurilor (CurrentCultureIgnoreCase,
InvariantCultureIgnoreCase, OrdinalIgnoreCase), dar nu le vom lua în considerare.

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.

Regula este următoarea:

- utilizați Ordinal și OrdinalIgnoreCase pentru comparații ca mod implicit, cu excepția cazului în


care aveți nevoie de o comparație de șiruri care să nu țină cont de specificul alfabetului. De
exemplu, acestea nu se află în alfabetul englez, ci în germană, ca în acest caz, există.

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.

De exemplu, când începem să tastăm ceva în cod:

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.

În acest caz, latura de rotunjire poate fi ajustată în felul următor:

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.

Rețineți! Math este o clasă statică și nu putem creea o instanța a acesteia.!


CONSTRUCȚII CONDIȚIONALE

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ă:

 Primul parametru este utilizată pentru inițializarea unei variabile;


 Al doilea parametru este utlizată pentru a indica condiția.Condiția este o expresie booleană
care va returna TRUE/FALSE .
 Al treilea parametru este iteratorul. Iteratorul definește variabila incrementată sau
decrementată a buclei.
În exemplul de mai jos se va afișa numerele de la 0 la 9. Utilizând doar for() , în primul parametru
vom inițializa o variabilă de tip int i, apoi vom indica condiția că i să fie mai mic ca 10, și
incrementarea variabilei i. Verficarea va începe cu 0, se va verifica dacă condiția este adevărată
atunci are loc incrementarea i++, și așa pînă condiția va deveni fals.

Instrucțiunea Foreach()

Bucla foreach() iterează colecții, ca exemplu matricii.

În exemplul de mai jos avem declarat o matrice, trebuie să afișăm lungimea acestei matrice, pentru
aceasta vom utiliza for().

În acest exemplu utilizăm instrucțiunea foreach() pentru a afișa elementele matricei>


ENUMERĂRI(Enum)
O enumerare este o construcție care vă permite să specificați mai multe stări. Sau mai putem
spune că e ste folosit pentru a stoca un set de constante numite, cum ar fi sezonul, zilele, luna,
mărimea etc. Constantele enum sunt, de asemenea, cunoscute sub numele de enumeratori.
Constantele Enum au valori implicite care încep de la 0 și sunt incrementate la una câte una.
Dar putem schimba valoarea implicită. Enum în C # poate fi declarat în cadrul sau în afara
clasei și structurilor.

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.

De asemenea, putem utiliza valori asociative. Să presupunem că luminozitatea luminii este


diferită pentru diferite culori.

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

Pentru aprofundarea cunoștințelor , puteți accesa metodele utilizate asupra Listelor


https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=net-5.0#methods
COLECȚIA DICTIONARY

Î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.

 În dicționar cheia nu poate fi nulă , dar trebuie să conțină o valoare.


 Cheia trebuie să fie unică în dicționar. Cheile dublicate nu sunt permise, dacă utilizăm
o cheie dublicată, atunci compilatorul va face o excepție
 În dicționar putem salva elementele numai de un singur tip
 Capacitatea unui dicționar corespunde cu numărul de elemente pe care le poate
conține.

Cum se creează un dicționar ?

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.

În primul rând vom include System.Collection.Generics;

Următorul pas vom crea un dicționar nou

Dictionary dictionary_name = new Dictionary();

Pentru a adăuga elemente noi într-un dicționar putem utiliza mai multe metode:

Declararea unui dicționar:

În paranteze <> noi indicăm două tipuri: tipul cheiei(aici el este int) și tipul valorii cu care
aceasta se asociază (string).

Să presupunem că baza de date conține numele persoanelor cu un ID specific. Deci, ID-urile


vor fi de tip int, numele vor fi de tip string.
La fel se poate face fără a utiliza metoda Add, dar respectând o sintaxă specială:

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:

De asemenea, puteți afla dacă Dicționarul conține o anumită cheie

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ă

În mod similar, există o metodă de extragere a valorii TryGetValue

Și ultima este metoda Clear, care elimină toate perechile cheie-valoare.


STACK / QUEUE

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.

Carcteristicile unui Stack:

 Capacitatea Stack-lui reprezintă cantitatea elementelor, pe care le poate deține un


Stack. Pe măsura adăugării elementelor noi în Stack , volumul său automat se mărește
pe măsură necesității prin realocare.
 Adăugarea unui element în partea superioară a Stack-lui, se va utiliza (Push()
împingere), eliminarea unui element din partea superioară a Stack-lui, se va utiliza
(PoP() scoatere)
 Eliminarea unui element, se va utiliza (Peek() inspectează)
 Stack acceptă elemente care se repetă.

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;

Adăugarea unui element în Stack

Metoda push() este folosită pentru a adăuga un element în Stack.

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.

Obținerea numărului de elemente în Stack.

Count() se va utiliza pentru a obține numărul de elemente în Stack.

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 verificarea elementelor în Stack, vom utiliza foreach()

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.

Adăugarea de elemente la coadă(queue)

Metoda enqueue(); este utilizată pentru a adăuga un element în coadă. Sintaxa generală a
enunțului este dată mai jos.

Eliminarea elementelor din coadă(queue)

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ă:

Vom verifica, dacă în queue se va conține un anumit element:

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 :

AddFirst(); adaugă un nou nod cu o valoare, la începutul listei.

AddLast(T value); introduce un nou nod cu valoare la sfârșitul listei

AddAfter( ); introduce un nou nod în listă cu valoare după nodul nodului.


Remove(T): este utilizată pentru a elimina prima apariție a valorii specificate din LinkedList.

RemoveFirst (): elimină primul nod din listă. După aceea, noul prim nod devine nodul următor
celui șters.

RemoveLast (): elimină ultimul nod din listă

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.

Modificatorii de access existenți sunt:

 Public – spune compilatorului că elementul poate fi accesat din orice


clasă,proprietate,metodă , este cel mai puțin restrictiv modificator.
 Private — spune compilatorului că elementul poate fi accesat doar din interiorul clasei
în care a fost declarat, este cel mai restrictiv modificator.
 Protected – spune compilatorului că elementul poate fi accesibil în clasa în care sunt
declarate și în instanțele claselor derivate.
 Internal – spune compilatorului că elementul poate fi accesat numai din acelaș
namespace.

Modificatorii de acces pot fi utilizați numai în fața: clasei,câmpuri, proprietăți, metode.

Declarea unei clasei :

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ă:

Alegeți Class și dați un nume clasei voastre.


Creați un program nou în care veți declara un obiect nou al clasei Class cu alocare de memorie
pentru aceasta. Pentru acest lucru vom folosi new() acest operator va aloca memorie pentru
obiectul Class();

Apoi , într-un fișier aparte creat(ClassNumeClass) 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.

Constructorul fără parametru:

Un constructor care nu are parametri se numește constructor implicit. Inițializează aceeași


valoare a fiecărei instanțe a clasei.

În fișierul Program.cs veți crea un obiect nou și vom apela metoda():


Rezultatul așteptat:

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.

Iar , în programul principal vom apela

Rezultat așteptat:
Un alt exemplu de utilizare a constructorului cu parametru:

Iar , în programul principal vom apela

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:

Ce trebuie reținut în ceea ce privește destructorii:

1. După cum se vede, are numele clasei și nu acceptă niciun parametru.

2. Nu are tip de returnare.

3. Este precedat de caracterul tilde „~”.

4. Nu acceptă modificatori de acces.

5. Sunt apelați în mod automat.

6. O clasă poate avea un singur destructor.


PRINCIPIILE MOŞTENIRII

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ă.

 Pe baza a ceea ce am amintit, putem spune că o clasă derivată este o versiune


specializată sau extinsă a clasei de bază.
 Clasa derivată moşteneşte toate elementele clasei de bază şi-şi adaugă altele proprii.
 Clasa derivată nu poate să şteargă nici un membru al clasei de bază.

Definirea unei clase derivate se face folosind sintaxa:

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.

Încapsularea folosind proprietăți.

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.

Sintaxa unei proprietăți:

Î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().

Un alt exemplu este de a utiliza fiecare bloc separat:


Trebuie sa modificam codul

Rezultatul obținut:
DELEGAȚI

În această lecție vom discuta despre astfel de caracteristici C# ca delegați, evenimente


și expresii lambda. Ele sunt fundamentul limbajului C#. Multe decizii de proiectare nu pot fi
luate fără utilizarea delegaților și a evenimentelor.

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!

Forma generală a unei delegări:

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.

Să presupunem că dezvoltăm o clasă Car, și are o metodă de Accelerare(). Și atunci când


proiectăm această clasă Car, dorim să oferim o notificare de nivel superior că mașina a
accelerat prea mult. Creăm o clasă în care variabila viteza este zero. De asemenea, va avea o
metodă Start() care oferă valoarea inițială pentru variabila viteza și o metodă Accelerare()
care mărește valoarea viteza cu 10, de fiecare dată când este apelată.
Să presupunem că codul de nivel superior creează un obiect de tipul car, îl rulează și apelează
metoda Accelerare() de mai multe ori. Să presupunem că, atunci când valoarea vitezei de 100
este depășită, vrem să anunțăm nivelul superior că mașina a accelerat prea mult, astfel încât
nivelul superior să poată reacționa cumva la acest lucru.

Î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().

Cum să determinați situația când viteza este prea mare?

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.

În primul rând, să creăm un delegat simplu și să analizăm sintaxa. Funcția care va


gestiona evenimentele nu va returna nimic. Delegatul este folosit ca un tip cu drepturi depline
și se numește PreaRepede(), nu ia argumente aici:

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().

Adică, codul clientului apelând Register_PreaRepede(); a transmis metoda


Handler_PreaRepede().

Metoda Handler_PreaRepede() o declarăm în felul următor:

Care va fi scris în instanța declarată preaRepede();

Și când apelăm metoda stocată în această variabilă:


De fapt se va apela handler-ul. Aceasta este, de fapt, ceea ce scriem instanței delegate. Apoi,
această variabilă stochează un link către metoda care a fost transmisă prin
Register_PreaRepede();

Și această metodă, la care se face referire în delegat, trebuie să se potrivească cu semnătura


delegatului:

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:

Cu alte cuvinte, atunci când apelăm metoda PreaRepede (), va fi apelat


Handler_PreaRepede(), în așa fel se va face legătura la acest eveniment. Prin urmare, un
delegat, în esență, este un tip care stochează o referință la o metodă care se potrivește cu
semnătura pe care am atribuit-o folosind cuvântul cheie delegate.
Acum să analizăm un exemplu în care trecem viteza curentă în handler. Apoi, declarăm un
delegat cu o alt tip de parametri.

În consecință,handler-ul trebuie să accepte o variabilă de tip int, ca și delegatul declarat de noi:

El însuși nu este apelat în codul clientului, este trecut doar la nivelul inferior, obiectului car,
prin intermediul unui delegat.

În rezultat la nivelul inferior vom obține cod după cerințele clientului:


În clasa Program vom obține următorul cod de program:

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.

Apoi, declarăm două metode AddNum() și MultiNum().

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ă.

C# permite ca numele parametrilor sau al variabilelor locale să fie același ca numele


varibilelor instanțelor. În așa caz numele local ascunde variabila instanței. Pentru a accesa
variabila instanței referindune la ea prin this.

Cuvântul cheie this este folosit în următoarele cazuri:

 Pentru setarea și obținerea valorilor din câmpurile unei clase


 Pentru apelarea constructorilor dintr-o clasă
 Când există un nume ca parametru în metoda unei clase și coincide cu numele unei
variabile din clasă

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ă.

Acordați atenție constructorului, în el dorim să atribuim valoarea argumentului „price” ,


câmpului „price” (chiar citirea acestei propoziții nu este convenabilă) ...

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ă

Și deja codul de program va arată astfel:

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

Un alt principiu fundamental al Programării Orientate Obiecte este abstracția. Se referă la


capacitatea acestei paradigme (obiect – orientate) de a simplifica realitatea prin conceptualizarea
elementelor reale, lucru realizat cu ajutorul metodelor și câmpurilor clasei. Abstractizarea datelor este
procesul prin care se ascunde anumite detalii și se afișează doar informații esențiale. Abstracția poate fi
realizată cu clase, interfețe. Clasa abstractă este o clasă declarată cu cuvântul cheie: abstract, și este o
clasă restricționată care nu poate crea obiecte( pentru a o accesa, trebuie moștenită de la o altă clasă).

Sintaxa:

Această clasă are următoarele caracteristici:

 nu se piermite să se creeze instanțe(obiecte) ale unei clase abstracte;


 o clasă abstractă poate conține atât metode/ proprietăți abstracte cît și obișnuite;
 toate metodele și proprietățile abstracte declarate în clasa de bază trebuie implementate în clasa
moștenită;

În exemplul de mai jos declarăm o clasă abstractă :

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

Furnizorul LINQ to Objects ne permite să interogăm un obiect în memorie, cum ar fi o matrice,


o colecție și tipuri generice. Oferă multe funcții încorporate pe care le putem folosi pentru a
efectua multe operațiuni utile, cum ar fi filtrarea, ordonarea și gruparea cu cod minim. Totodată
LINQ to Object prezintă tratarea oricărei întrebări LINQ care acceptă IEnumerable pentru
accesarea colecțiilor și obiectelor de memorie în memorie. Variabila Returnare în Linq la
obiecte va fi de tipul IEnumerabil.

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

O interogare clasică de SQL a tabelei, se scrie astfel:

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:

 Primul pas este să includem o bibliotecă specială


using System.Linq;
 Apoi , creați o sursă de date cu care doriți să operați. De exemplu creati o listă nouă:

List my_list = new List(){ elemente };

 Acum, faceți o interogare folosind cuvintele cheie select, from


var res = from li in my_list
where li.Contains("my")
select li;
 Ultimul pas este să executați interogarea utilizând o buclă foreach.

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.

SELECT Operatorul select face proiecția datelor pe câmpurile pe care le primește ca


parametru.

ORDERBY si ORDERBYDESCENDING

Sunt folosiți pentru ordonarea rezultatelor după un câmp specificat ca paramentru.

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

Grupează rezultatele în funcție de un anumit criteriu(cheie).

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.

CONCAT Concatenează rezultatele obținute din două interogări LINQ.

S-ar putea să vă placă și