c# - questions and aswers

53
Intrebari pentru toti care scriu cod: - Ce este un Windows Service si cum diferenta ciclul de viata fata de un “standard” .EXE ?? Un serviciu este o aplicaţie ca oricare alta. Diferenţa între servicii şi celelalte programe este faptul că ele rulează în fundal şi nu oferă o interfaţă cu utilizatorul, în care să poţi da, de exemplu, clicuri. Ele sunt gândite să ofere caracteristici esenţiale pentru nucleul sistemului de operare precum servicii web, înregistrarea evenimentelor, accesul la fişiere, imprimare de documente ori raportarea erorilor. Nu toate serviciile sunt dezvoltate de Microsoft. Unele aplicaţii îşi instalează propriile lor servicii. Suitele de securitate sunt un exemplu foarte bun, ele instalând diverse servicii pentru a putea oferi la rândul lor servicii de monitorizare în timp real a activităţilor sistemului, protecţie firewall, etc. Aceste suite au nevoie de avantajele oferite de utilizarea serviciilor. Un astfel de avantaj este faptul că ele pot fi pornite în timpul pornirii sistemului, înaintea altor programe şi chiar înainte de a te conecta la calculator. Dar cel mai important este faptul că ele pot monitoriza tot ce se întâmplă pe calculator, fiind integrate perfect cu nucleul Windows. Astfel, ele pot oferi un nivel înalt de protecţie. Un alt exemplu de serviciu ce nu aparţine Microsoft ar putea fi un server SSH, des folosit la birouri pentru conexiunile securizate la distanţă. Cunoaşterea a ceea ce înseamnă un serviciu poate fi utilă în anumite cazuri. De exemplu, dacă ştii că nu vei avea nevoie de caracteristicile oferite de un serviciu, îl poţi dezactiva pentru a elibera resurse. Dacă ai un router instalat pentru reţeaua ta locală, este foarte posibil să nu ai nevoie de serviciul Internet Connection Sharing. Sau, dacă ai nevoie ca un serviciu să ruleze, dar nu este atât de

Upload: andrajora92

Post on 22-Oct-2015

51 views

Category:

Documents


2 download

DESCRIPTION

c#

TRANSCRIPT

Intrebari pentru toti care scriu cod:

- Ce este un Windows Service si cum diferenta ciclul de viata fata de un “standard” .EXE ??

Un serviciu este o aplicaţie ca oricare alta. Diferenţa între servicii şi celelalte programe este faptul

că ele rulează în fundal şi nu oferă o interfaţă cu utilizatorul, în care să poţi da, de exemplu, clicuri. Ele

sunt gândite să ofere caracteristici esenţiale pentru nucleul sistemului de operare precum servicii web,

înregistrarea evenimentelor, accesul la fişiere, imprimare de documente ori raportarea erorilor. Nu toate

serviciile sunt dezvoltate de Microsoft. Unele aplicaţii îşi instalează propriile lor servicii. Suitele de

securitate sunt un exemplu foarte bun, ele instalând diverse servicii pentru a putea oferi la rândul lor

servicii de monitorizare în timp real a activităţilor sistemului, protecţie firewall, etc. Aceste suite au

nevoie de avantajele oferite de utilizarea serviciilor. Un astfel de avantaj este faptul că ele pot fi pornite în

timpul pornirii sistemului, înaintea altor programe şi chiar înainte de a te conecta la calculator. Dar cel

mai important este faptul că ele pot monitoriza tot ce se întâmplă pe calculator, fiind integrate perfect cu

nucleul Windows. Astfel, ele pot oferi un nivel înalt de protecţie. Un alt exemplu de serviciu ce nu

aparţine Microsoft ar putea fi un server SSH, des folosit la birouri pentru conexiunile securizate la

distanţă. Cunoaşterea a ceea ce înseamnă un serviciu poate fi utilă în anumite cazuri. De exemplu, dacă

ştii că nu vei avea nevoie de caracteristicile oferite de un serviciu, îl poţi dezactiva pentru a elibera

resurse. Dacă ai un router instalat pentru reţeaua ta locală, este foarte posibil să nu ai nevoie de

serviciul Internet Connection Sharing. Sau, dacă ai nevoie ca un serviciu să ruleze, dar nu este atât de

important, îl poţi seta să pornească puţin mai târziu, după ce au fost deja pornite Windows, aplicaţiile ce

pornesc imediat după Windows sau alte servicii mai importante. În cazul meu, unul din aceste servicii, de

care am nevoie dar nu îmi este esenţial, este serviciul Windows Time, serviciu ce sincronizezază data şi

ora. De aceea, am decis să îl setez să pornească în modDelayed (Pornire întârziată).

C# Question:

1. Principiile POO?

ABSTRACTIZAREA: reprezinta o clasa generic , metodele sunt doar declarate , pentru a putea fi

apelate dar implementarea se face in clasele derivate: abstract tip numeMetoda(lista de argumente); O

clasa ce are cel putin o metoda abstracta trebuie sa fie abstracta : abstract NumeClasa,

Clasele abstracte nu pot fi instantiate!! Clasele derivate trebuie sa implementeze metodele abstracte

mostenite sau la randul lor abstracte. Clasele abstracte pot avea constructori, acestia pot fi apelati din

constructorii claselor derivate.

O clasa abstracta poate avea metode implementate, poate avea variabile de instant si de clasa. Metodele

abstracte oblige proiectantul de clase derivate sa le implementeze.

INCAPSULAREA:  numită și ascunderea de informații: asigură faptul că obiectele nu pot schimba starea

internă a altor obiecte în mod direct (ci doar prin metode puse la dispoziție de obiectul respectiv); doar

metodele proprii ale obiectului pot accesa starea acestuia. Fiecare tip de obiect expune o interfață pentru

celelalte obiecte care specifică modul cum acele obiecte pot interacționa cu el.

MOSTENIREA: Proprietatea de moştenire: proprietatea claselor prin care o clasă nou construită poate

prelua datele şi metodele clasei mai vechi.

O clasa care este mostenita se numeste clasa de baza, iar clasa care mosteneste anumite caracteristici se

numeste clasa derivata.

O clasa deriva doar o singura clasa de baza.

O clasa poate implementa mai multe interfete

Se foloseste semnul : pentru mostenire in C#, dar este asemanator cu cel al extends and implements din

Java.

POLIMORFISMUL: Polimorfismul este capacitatea unei entitati de a lua mai multe forme. In limbajul

C# polimorfismul este de 3 feluri: parametric, ad–hoc si de mostenire.

Polimorfismul parametric : este cea mai slaba forma de polimorfism, fiind regasita ın majoritatea

limbajelor. Prin polimorfismul parametric se permite ca o implementare de functie sa poata prelucra orice

numar de parametri. Acest lucru se poate obtine prin folosirea ın C# a unui parametru de tip params.

Polimorfismul ad–hoc: Se mai numeste si supraıncarcarea metodelor, mecanism prin care ın

cadrul unei clase se pot scrie mai multe metode, avand acelasi nume, dar tipuri si numere diferite de

parametri de apel. Alegerea functiei care va fi apelata se va face la compilare, pe baza corespondentei

ıntre tipurile parametrilor de apel si tipurile parametrilor formali.

Polimorfismul de mostenire: Este forma cea mai evoluata de polimorfism. Daca precedentele forme de polimorfism sunt aplicabile fara a se pune problema de mostenire, ın acest caz este necesar sa existe o ierarhie de clase. Mecanismul se bazeaza pe faptul ca o clasa de baza defineste un tip care este compatibil din punct de vedere al atribuirii cu orice tip derivat, ca mai jos:

class B{...}

class D: B{...}

class Test

{

static void Main()

{

B b = new D();// upcasting=conversie implicita catre baza B

}

}

2. Avem mostenire multima in c#?

NU exista mostenire multipla in c# , acest concept este intalnit in c++. O clasa mosteneste doar o super

clasa si implementeaza mai multe interfete.

3. Ce reprezinta abstract? Ce reprezinta sealed ?

Modificatorul abstract

    In unele cazuri, este necesar crearea unei clase de baza care stabileste un sablon general comun pentru toate clasele derivate, fiecare completand detaliile caracteristice. O clasa care este definita cu  abstract,  nu poate fi instantiata, poate contine metodeabstract, iar o clasa derivata dintr-o clasa abstract trebuie sa o implementeze in totalitate.

    Modificatorul abstract poate fi aplicat si asupra metodelor, proprietatilor.

//aceasta clasa

//nu va putea fi mostenita

abstract class M

{

public abstract void Metoda();

}

Modificatorul sealed

Se foloseste in situatiile in care se doreste impiedicarea mostenirii.

//aceasta clasa

//nu va putea fi mostenita

sealed class M

{

}

Modificatorii sealed si abstract nu pot fi folositi impreuna pentru o clasa.  Pentru ca .Net nu permite derivarea multipla, o clasa nu poate deriva din doua clase; in loc de folosirea claselor abstracte se pot folosi interfete, care se aseamana cu clasele abstract – definesc un obiect fara a specifica implementarea concreta. O clasa pote implementa mai mult de o interfata.

4. Cum sa apelezi o metoda dintr-o clasa derivata din clasa de baza?

5. public class WireLessDevice6. { // base class7. protected virtual void ParseMessage()8. {9. // Do common stuff in here10. }11. }12.13. public class WiFi : WireLessDevice14. { // derived class15. override void ParseMessage()16. {17. base.ParseMessage();//Call this if you need some operations from base impl.18. DoGPSStuff();19. }20. private void DoGPSStuff()21. {22. //some gps stuff23. }

24. GPSLoc Loc;25. }

5. Ce este supraincarcarea metodelor?

Una dintre cele mai interesante facilitati oferite de C# o reprezinta supraincarcarea metodelor.

Definitie. Spunem ca metodele sunt supraincarcate atunci cand doua sau mai multe metode din

cadrul aceleiasi clase au acelasi nume.

Observatii: -Daca metodele sunt supraincarcate atunci declaratiile parametrilor lor difera. Metodele au un

numar diferit de parametri sau acelasi numar de parametrii insa de tipuri diferite. Pe scurt, metodele nu au

aceeasi signatura. Signatura unei metode reprezinta numele unei metode si lista parametrilor acesteia.

-Signatura unei metode nu include tipul rezultatului intors.

Daca metodele au acelasi nume, acelasi numar si tip de parametrii insa tipul rezultatului intors este diferit

atunci se produce o eroare. Compilatorul nu dispune de suficienta informatie pentru a decide care metoda

sa aleaga.

-Prin supraincarcarea metodelor, limbajul C# implemeteaza conceptul de polimorfism. Altfel spus, C#

implementeaza paradigma “o singura interfata, mai multe metode”. In limbajele care nu permit

supraincarcarea, exista mai multe versiuni ale aceleiasi functii. Spre exemplu, in C, functia abs( )

intoarce valoarea absoluta a unui intreg, labs( ) valoarea absoluta a unui intreg lung, iar fabs( ) valoarea

absoluta a unui float. In C# toate metodele care calculeaza valoarea absoluta au acelai nume Abs( ). Este

misiunea compilatorului sa aleaga care metoda a lui Abs( ) trebuie sa o foloseasca. Asadar, utilizand

conceptul de supraincarcare a metodelor, mai multe metode au fost comprimate in una singura.

-Exista situatii in care tipurile parametrilor formali nu coincid cu tipurile parametrilor efectivi. In acest

caz se realizeaza o conversie automata de tip. Versiunea metodei alese este aceea pentru care setul de

parametrii formali este cel mai apropiat desetul de parametri efectivi.

6. Instructiuni de ciclare?

Exista 4 instructiuni de ciclare: while, do, for, foreach.

WHILE: Permite executarea unei instructiuni atata timp cat valoarea unei expresii logice este adevarata (ciclu cu test anterior).

Sintaxa:

while (expresie logica) instructiune;

In interiorul unei astfel de instructiuni se poate folosi o Instructiune de salt de tip break sau continue.

while (r != 0)

{r = a%b;

a = b;

b = r;

}

DO

Executa o instructiune o data sau de mai multe ori, cat timp o conditie logica este adevarata (ciclu cu test posterior).

Exemplu:

do

{S += i++;

}while(i<=n)

Poate contine instructiuni break sau continue.

FOR

Executa o secventa de initializare, dupa care va executa o instructiune atata timp cat o conditie este adevarata (ciclu cu test anterior); poate sa contina un pas de reinitializare (trecerea la pasul urmator). Se permite folosirea instructiunilor break si continue.

Exemplu:

for (int i=0; i<n; i++)

{Console.WriteLine("i={0}", i);

}

FOREACH

Enumera elementele dintr–o coletie, executand o instructiune pentru fiecare element. Colectia poate sa fie orice instanta a unei clase care implementeaza interfata System.Collections.IEnumerable.

int[] t = {1, 2, 3};

foreach( int x in t)

{Console.WriteLine(x);

}

Elementul care se extrage este de tip read–only (deci nu poate fi transmis ca parametru ref sau out si nu se poate aplica un operator care sa ıi schimbe valoarea).

Instructiuni de salt

Permit schimbarea ordinii de executie a instructiunilor. Ele sunt: break, continue, goto, return, throw.

BREAK

Produce iesirea fortata dintr–un ciclu de tip while, do, for, foreach.

CONTINUE

Porneste o noua iteratie ın interiorul celui mai apropiat ciclu continator de tip while, do, for, foreach.

GOTO

Goto permite saltul al o anumit˘a instruc¸tiune. Are 3 forme:

goto eticheta;

goto case expresie constanta;

goto default;

Cerinta este ca eticheta la care se face saltul sa fie definita ın cadrul functiei curente si saltul sa nu se faca

ın interiorul unor blocuri de instructiuni, deoarece nu se poate reface ıntotdeauna contextul acelui bloc. Se

recomanda evitarea utilizarii intense a acestui cuvant cheie, ın caz contrar se poate ajunge la fenomenul

de "spagetti code". Pentru o argumentare consistenta a acestei indicatii

RETURN

Determina cedarea controlului funtiei apelante de catre functia apelata. Daca functia apelata are tip de

retur, atunci instructiunea return trebuie sa fie urmata de o expresie care suporta o conversie implicita

catre tipul de retur.

7. Care este diferenta intre clasa (heap) si structura (stack)?

STIVA (stack-ul) este bucata de memorie in care alocarea se face pe principiul LIFO (last-in-first-out).

Poti privi stiva ca un teanc de cutii inalt cat o camera (dimensiunea maxima); cand ai nevoie de o

variabila locala (automata) iei ultima cutie, o stivuiesti alaturi si tot asa cu urmatoarele variabile. La

iesirea din blocul de executie cutiile sunt puse, automat, inapoi in stiva initiala in ordine inverse (daca ai

lua prima cutie, stiva s-ar darma). Alocarea variabilelor din stiva este foarte rapida (trebuie doar sa iei

cutia urmatoare; nu cauti).

int fun()

{

  int i; // i este alocata

  for ( int j = 0 /* j este alocata */; j < 10; ++j )

  {

    //…

  } // j este dealocata

  // ...

} // i este dealocata

HEAP: Memoria dinamica (heap sau free store) este zona de memorie din care alocare/dealocarea se

face prin intermediul unui manager (new/delete). Este ca un raft in care ai cutii goale. Cand ai nevoie de

o variabila, o ceri managerului (new) iar managerul cauta o cutie goala de dimensiunea ceruta. Cautarea ia

mai mult timp decat in cazul stivei, dar heap-ul este mult mai mare decat stiva. Existenta variabilei nu se

incheie in mod automat: daca nu mai ai nevoie de ea, trebuie s-o pui inapoi in heap (delete).

8. Modificatori de access

Modificatorii de clasa sunt:

public - clasele publice sunt accesibile de oriunde; poate fi folosit atat pentru clase imbricate, cat si

pentru clase care sunt continute ın spatii de nume;

internal - se poate folosi atat pentru clase imbricate, cat ¸si pentru clase care sunt continute ın spatii de

nume (este modificatorul implicit pentru clase care sunt continute ın spatii de nume). Semnifica acces

permis doar ın clasa sau spatiul de nume care o cuprinde;

protected - se poate specifica doar pentru clase imbricate; tipurile astfel calificate sunt accesibile ın clasa

curenta sau ın cele derivate (chiar daca clasa derivata face parte din alt spatiu de nume);

private - doar pentru clase imbricate; semnifica acces limitat la clasa continatoare; este modificatorul

implicit;

MEMBRII UNEI CLASE”

protected internal - folosibil doar pentru clase imbricate; tipul definit este accesibil ın spatiul de nume

curent, ın clasa contiatoare sau ın tipurile derivate din clasa continatoare;

new - permis pentru clasele imbricate; clasa astfel calificata ascunde un membru cu acelasi nume care

este mostenit;

sealed - o clasa sealed nu poate fi mostenita; poate fi clasa imbricata sau nu;

abstract - clasa care este incomplet definita ¸si care nu poate fi instantiata; folosibila pentru clase

imbricate sau continute ın spatii de nume;

partial - clasa este definita ın mai multe fisiere

9. Care este diferenta intre virtual vs. new?

Override: When a method of a base class is overridden in a derived class, the version in the derived class

is used, even if the calling code didn't "know" that the object was an instance of the derived class.

O metoda de tip override poate fi declarata ca fiind de tip sealed, astfel ımpiedicandu–se suprascrierea

ei ıntr–o clasa derivata din cea curenta.

New: If you use the new keyword instead of override, the method in the derived class doesn't override the

method in the base class, it merely hides it.

Modificatorul new se foloseste pentru a indica faptul ca o metoda dintr-o clasa derivata care are aceeasi

semnatura cu una dintr–o clasa de baza nu este o suprascriere polimorfica a ei, ci apare ca o noua metoda.

Este ca si cum metoda declarat˘a new ar avea nume diferit.

If you don't specify either new or overrides, the resulting output is the same as if you specified new, but

you'll also get a compiler warning (as you may not be aware that you're hiding a method in the base class

method, or indeed you may have wanted to override it, and merely forgot to include the keyword)

10. Interfata vs. Clasa abstracta?

  O interfata defineste  un set de metode, proprietati, evenimente, indexatori care vor fi implementate de

o clasa. Atentie, interfetele NU implementeaza, ele sunt abstracte si doar isi descriu  membrii. Interfata

precizeaza CE trebuie facut, dar NU si CUM trebuie facut.

 Sintactic, interfetele sunt asematoare cu clasele abstract, cu mentiunea ca nici o metoda nu poate avea

corp. Se foloseste cuvantul cheie interface.

Ce este o interfata ?O interfata defineste un set de metode, proprietati, evenimente, indexatori. Acesti membri vor fi implementati de o clasa sau chiar de o structura.

Interfata contine doar signatura membrilor.

Daca nu se specifica nici un modificator de acces pentru interfata, atunci cel implicit va fi internal. Daca se afla in interiorul unei clase, o interfata poate avea modificatorii de access private,  protected,  public,  internal.

O clasa poate implementa mai multe interfete.

Ce este o clasa abstracta ?

O clasa abstracta este o clasa care nu poate fi instantiata si este folosita pentru mostenire.O clasa care nu este abstracta si care deriveaza dintr-o clasa abstracta, trebuie sa includa implementarile tuturor membrilor abstracti.

Clasa abstracta poate avea ca membri si campuri (field).

O clasa poate mosteni o singura clasa abstracta.

O clasa poate furniza atat membri abstracti cat si membri cu implementare concreta.

Daca adaugam un nou membru la o interfata, atunci va trebui sa urmarim toate implementarile interfetei si sa scriem cod pentru implementarea noului membru.

Daca adaugam un nou membru la o clasa abstracta ii putem adauga o implementare implicita si nu vom avea probleme cu codul existent.

Concluzii:

O interfata nu contine cod pentru implementare, ea contine doar signaturile.

O clasa abstracta poate contine codul complet sau partial, care poate fi rescris.

O interfata nu poate contine ca membri: constante, constructori, destructori, campuri, membri static

sau alte interfete.

Intr-o clasa abstracta se pot defini campuri, constante, metode, proprietati.

Din punct de vedere al vitezei de executie, o interfata este mai lenta decat o clasa abstracta.

11. string vs. StringBuilder?

String:

- apartine spatiului de nume System.String,

- String object este immutable,

- Declararea se face astfel: string s =”something”;

- Folosim operatorul “+” sau metoda Concat pentru concatenarea stringurilor

- Cand concatenam se aloca memorie suplimentara

StringBuilder

- Apartine spatiului de nume String.Text

- StringBuilder este un obiect mutable

- Declararea se face StringBuilder sbuild = new StringBuilder(“something”);

- Pentru concatenare folosim metoda Append

- Se aloca memorie suplimentara cand capacitatea se depaseste capacitatea bufferului

StringBuffer - este thread safe

13. Poate fi DateTime null?

DateTime este un tip valoare (*struct) si struct nu poate lua valoare null. Putem folosi DateTime.MinValue pt a seta cea mai mica valoare.

14. Care este diferenta dintre un DLL si un .EXE

Un fisier .EXE este fisierul in care se afla codul interpretabil de catre procesor al unui program. Contine

metoda main.

Un fisier DLL este o colectie de subrutine (functii, proceduri, obiecte, metode, etc) care sunt folosite

(atunci cand este cazul) de catre programele executabile.

15. ce reprezinta blocul using (..) {} ?

Blocul using ajuta pt managementul resurselor. Implementeza interfata IDisposible. Se apeleaza metoda

Disposible iar obiectul creat nu poate fi modificat si reasignat.

Determin˘a ob¸tinerea a unei sau mai multor resurse, execut˘a o instruc¸tiune si apoi disponibilizeaz˘a resursa: using ( achizitie de resurse ) instructiune

O resursa este o clas˘a sau o structur˘a care implementeaz˘a interfa¸ta System.IDisposable, care include o sigur˘a metod˘a f˘ar˘a parametri Dispose(). Achizitia de resurse se poate face sub form˘a de variabile locale sau a unor expresii; toate acestea trebuie s˘a fie implicit convertibile la IDisposable. Variabilele locale alocate ca resurse sunt read–only. Resursele sunt automat dealocate (prin apelul de Dispose) la sfˆar¸situl instruc¸tiunii (care poate fi bloc de instruc¸tiuni). Motivul pentru care exista aceasta instruc¸tiune este unul simplu: uneori se dore¸ste ca pentru anumite obiecte care detin resurse importante s˘a se apeleze automat metod˘a Dispose() de dezalocare a lor, cˆat mai repede cu putinta.

16. Ce reprezinta sintaxa lock()? Exista situatii cand vrem sa blocam alte variabile decat cele de tip int. Un lock marcheaza o sectiune

critica a codului, producand astfel sincronizare pentru un obiect. La utilizare, se specifica un obiect pentru

care se stabileste un lock, dupa care o instructiune sau un grup de instructiuni. Lock–ul este ınlaturat la

sfarsitul instructiunii/blocului de instructiuni. Sintaxa este:

lock(expresie)

{

instructiuni

}

17. Ce reprezinta o exceptie?

Un programator nu trebuie sa confunde tratarea exceptiilor cu erorile sau bug–urile. Un bug este o eroare

de programare care ar trebui sa fie fixata ınainte de livrarea codului. Exceptiile nu sunt gandite pentru a

preveni bug– urile (cu toate ca un bug poate sa duca la aparitia unei exceptii), pentru ca acestea din urma

ar trebui sa fie eliminate.

Chiar daca se scot toate bug–urile, vor exista erori predictibile dar neprevenibile, precum deschiderea

unui fisier al carui nume este gresit sau ımpartiri la 0. Nu se pot preveni astfel de situatii, dar se pot

manipula astfel ıncat nu vor duce la prabusirea programului. Cand o metoda ıntalneste o situatie

exceptionala, atunci se va arunca o exceptie; cineva va trebui sa sesizeze (sa “prinda”) aceasta exceptie,

sau eventual sa lase o functie de nivel superior sa o trateze. Daca nimeni nu trateaza aceasta exceptie,

atunci CLR o va face, dar aceasta duce la oprirea thread–ului.

In C# se pot arunca ca exceptii obiecte de tip System.Exception sau derivate ale acestuia. Exista o ierarhie

de exceptii care se pot folosi, sau se pot crea propriile tipuri exceptie. Enumeram urmatoarele metode si

proprietati relevante ale clasei Exception:

• public Exception(), public Exception(string), public Exception(string, Exception) - constructori; ultimul

preia un obiect de tip Exception (sau de tip clasa derivata) care va fi ıncapsulat ın instanta curenta; o

exceptie poate deci sa contina ın interiorul sau o instanta a altei exceptii (cea care a fost de fapt semnalata

initial).

• public virtual string HelpLink {get; set;} obtine sau seteaza o legatura catre un fisier help asociat acestei

exceptii; poate fi de asemenea o adresa Web (URL)

• public Exception InnerException {get;} returneza exceptia care este ıncorporata ın exceptia curenta ¸Si

nu neaparat a ıntregului proces!

• public virtual string Message {get;} obtine un mesaj care descrie exceptia curenta

• public virtual string Source {get; set;} obtine sau seteaza numele aplicatiei sau al obiectului care a

cauzat eroarea

• public virtual string StackTrace {get;} obtine o reprezetare string a apelurilor de metode care au dus la

aparitia acestei exceptii

• public MethodBase TargetSite {get;} obtine metoda care a aruncat exceptia curenta

Aruncarea si prinderea exceptiilor

Aruncarea cu throw

Aruncarea unei exceptii se face folosind instructiunea throw. Exemplu:

throw new System.Exception();

Aruncarea unei exceptii opreste executia metodei curente, dupa care CLR ıncepe sa caute un manipulator

de exceptie. Daca un handler de exceptie nu este gasit ın metoda curenta, atunci CLR va curata stiva,

ajungandu–se la metoda apelanta. Fie undeva ın lantul de metode care au fost apelate se gaseste un

exception handler, fie thread–ul curent este terminat de catre CLR.

Prinderea cu catch

Prinderea si tratarea exceptiei se poate face folosind un bloc catch, creat prin intermediul instructiunii

catch. Se observa ca s–a folosit un bloc try pentru a delimita instructiunile care vor duce la aparitia

exceptiei. In momentul ın care se arunca exceptia, restul instructiunilor din blocul try se ignora si

controlul este preluat de catre blocul catch. Deoarece exceptia a fost tratata, CLR–ul nu va mai opri

procesul. Se observa ca ın blocul catch nu s–a specificat tipul de exceptie care se prinde; asta ınseamna ca

se va prinde orice exceptie se va arunca, indiferent de tipul ei. Chiar daca exceptia este tratata, executia nu

se va relua de la instructiunea care a produs exceptia, ci se continua cu instructiunea de dupa blocul catch.

Uneori, prinderea si tratatarea exceptiei nu se poate face ın functia apelata, ci doar ın functia apelanta.

Este posibil ca ıntr–o secventa de instructiuni sa se arunce mai multe tipuri de exceptii, ın functie de

natura starii aparute. In acest caz, prinderea exceptiei printr–un bloc catch generic, ca mai sus, nu este

utila; am vrea ca ın functie de natura exceptiei aruncate, sa facem o tratare anume. Se sugereaza chiar sa

nu se foloseasca aceasta constructie de prindere generica, deoarece ın majoritatea cazurilor este necesar sa

se cunoasca natura erorii (de exemplu pentru a fi scrisa ıntr-un fisier de logging, pentru a fi consultata mai

tarziu). In exemplul de mai sus s–a convenit ca o ımpartire cu numitor 0 sa duca la o execeptie

System.DivideByZeroException, iar o ımpartire cu numarator 0 sa duca la aparitia unei exceptii de tip

System.ArithmeticException. Este posibila specificarea mai multor blocuri de tratare a exceptiilor. Aceste

blocuri sunt parcurse ın ordinea ın care sunt specificate, iar primul tip care se potriveste cu exceptia

aruncata (ın sensul ca tipul exceptie specificat este fie exact tipul obiectului aruncat, fie un tip de baza al

acestuia - din cauza de upcasting) este cel care va face tratarea exceptiei aparute. Ca atare, este important

ca ordinea exceptiilor tratate sa fie de la cel mai derivat la cel mai general. In exemplul anterior,

System.DivideByZeroException este derivate din clasa System.ArithmeticException.

Blocul finally

Uneori, aruncarea unei exceptii si golirea stivei pana la blocul de tratare a exceptiei poate sa nu fie o idee

buna. De exemplu, daca exceptia apare atunci cand un fisier este deschis (si ınchiderea lui se poate face

doar ın metoda curenta), atunci ar fi util ca sa se ınchida fisierul ınainte ca sa fie preluat controlul de catre

metoda apelanta. Altfel spus, ar trebui sa existe o garantie ca un anumit cod se va executa, indiferent daca

totul merge normal sau apare o exceptie. Acest lucru se face prin intermediul blocului finally, care se va

executa ın orice situatie. Existenta acestui bloc elimina necesitatea existentei blocurilor catch (cu toate ca

si acestea pot sa apara).

18. Care este diferenta dintre un Thread si un Process? Zombie Process?

Diferenta dintre un proces si un thread este ca procesele sunt izolate total unul de celalalt, in

timp ce thread-urile impart aceeasi memorie (heap) cu alte thread-uri care ruleaza in aceeasi aplicatie (un

thread poate prelua informatii noi, in timp ce un alt thread le prelucreaza pe cele existente). Un fir de

executie (thread) este un program secvential, care poate fi executat concurent cu alte fire. Un thread este

o unitate de executie intr-un proces. Un proces poate avea mai multe fire de executie, el numindu-

se multithread.

Un proces zombie este un proces care a murit dar care nu a fost așteptat (wait) de procesul părinte;

informațiile legate de încheiere ocupă spațiu în memorie până la un

apelwait/waitpid/WaitForSingleObject al procesului părinte. Apelul wait are, așadar, legătură directă cu

procesele zombie.

19. Ce este deadlock?

A deadlock is a situation where an application locks up because two or more activities are waiting for

each other to

finish. This occurs in multithreading software where a shared resource is locked by one thread and

another thread

is waiting to access it and something occurs so that the thread holding the locked item is waiting for the

other

thread to execute.

First, it's important to understand what a deadlock among threads is and the conditions that lead to one.

Many OS

course textbooks will cite the four conditions necessary for a deadlock to occur:

A limited number of a particular resource. In the case of a monitor in C# (what you use when you

employ

the lock keyword), this limited number is one, since a monitor is a mutual-exclusion lock

(meaning only one

thread can own a monitor at a time).

The ability to hold one resource and request another. In C#, this is akin to locking on one object

and then

locking on another before releasing the first lock, for example:

20. Ce este un constructor static?

Un constructor static este un membru care implementeaza actiunile cerute pentru initializara unei clase.

Declararea unui constructor static se face ca mai jos:

atribute modificator-de-constructor-static identificator( ) corp

Modificatorii de constructori statici se pot da sub forma:

extern static sau static extern

Constructorii statici nu se mostenesc, nu se pot apela direct si nu se pot supraıncarca. Un constructor

static se va executa cel mult o data ıntr-o aplicatie.

Se garanteaza faptul ca acest constructor se va apela ınaintea primei creari a unei instante a clasei

respective sau ınaintea primului acces la un membru static. Acest apel este nedeterminist,

necunoscandu–se exact cand sau daca se va apela. Un astfel de constuctor nu are specificator de acces si

poate sa acceseze doar membri statici.

21. Ce este Gargage Collector?

Managementul memoriei este una din sarcinile cele mai consumatoare de timp ın programare. Garbage

collection este mecanismul care se declanseaza atunci cand alocatorul de memorie raspunde negativ la

o cerere de alocare de memorie. Implementarea este de tip “mark and sweep”: se presupune initial ca

toata memoria alocata se poate disponibiliza, dupa care se determina care din obiecte sunt referite de

variabilele aplicatiei; cele care nu mai sunt referite sunt dealocate, celelalte zone de memorie sunt

compactate. Obiectele a caror dimensiune de memorie este mai mare decat un anumit prag nu mai sunt

mutate, pentru a nu creste semnificativ penalizarea de performanta. In general, CLR este cel care se

ocupa de apelarea mecanismului de garbage collection. Totusi la dorinta, programatorul poate sugera

rularea lui.

22. Care este diferenta intre Dispose() si Finalize() ?

Ce e cu Dispose? Exista o interfata, IDisposable, care contine o metoda Dispose(); Cine implementeaza

aceasta interfata in clasa lui, si-a cumparat un loc la procesul de deratizare. In momentul in care un obiect

este curatat din memorie, GC executa, daca poate, Dispose(). Aceasta metoda poate fi executata si de

user.

Ce e cu Finalize? Aceasta este versiunea de destructor in .Net. Cum se scrie aceasta? Simplu:

public class Person{ public Person() { /* constructor code goes here */ } ~Person() { /* destructor */ }}

ceea ce compilerul traduce in:

protected override void Finalize() { try { // do work here } finally { base.Finalize(); } }

Atat in Finalize cat si in Dispose, in mod normal, ar trebui eliberate resursele unmanaged folosite de

obiect. Diferenta dintre cele doua este, simplu spus, ca Dispose poate fi executat de user (este ok sa

scrii instance.Dispose(), insa Finalise este executat numai de GC.

23. Ce este un Serviciu Web?

Un serviciu web este o componentă software descrisă print-un modul WSDL care oferă posibilitatea

să fie accesată folosind protocoale de rețea standard de genul SOAP și HTTP.

Un serviciu web este un software care se pune la dipoziție pe Internet și care folosește un sistem de

mesaje standardizat bazat pe XML. Pentru a găsi serviciul dorit și interfața publică a acestuia trebuie

să existe mecanisme simple. ( http://www.factory3x5.com/more_info/glossary.xml )

Un serviciu web este o colecție de protocoale și standarde folosite pentru schimbul de date între

aplicații sau sisteme. Aplicațiile software scrise în limbaje de programare diferite și care rulează pe

diverse platforme pot folosi serviciile web pentru a face schimb de date pe rețea (Internet), într-o

manieră oarecum asemănătoare comunicării între procesele de pe un singur calculator.

Interoperabilitatea se datorează folosirii unor standarde publice adecvate.

24. Ce este WCF? Si ce reprezint ABC pt WCF?

WCF este proiectat avand in vedere principiile arhitecturii orientate pe servicii pentru a suporta caclculul

distribuit (“Distributed computing”) unde serviciile sunt consumate de clienti. Clientii pot consuma servicii

multiple si un serviciu poate fi consumat de mai multi clienti. Serviciile au o interfata WSDL. WFC

implementeaza mai multe servicii Web standard cum ar fi: WS-Addressing, WS-ReliableMessaging si

WS-Security. Modelele de programare ale aplicatiilor ce au nevoie sa comunice intre ele raman in

continuare viabile. Putem programa utilizand WCF sau celelalte modele.

WCF consta dintr-o multime de clase noi: Service Model, Channel Layer, XML Formatter, Extensible Security Infrastructure. De asemenea s-au adaugat functionalitati pentru gazduirea solutiilor WCF.

WCF:

Un serviciu reprezinta unitatea functionala expusa spre a fi utilizata.

Un serviciu poate fi local sau remote. Clientii si serviciile interactioneaza prin trimiterea / primirea de mesaje.

Nucleul de baza pentru WCF este furnizat de urmatorii assemblies:

System.Runtime.Serialization.dll : defineste spatiile de nume si tipurile ce pot fi folosite pentru serializarea si deserializarea obiectelor in WCF.

System.ServiceModel.dll : assembly ce contine tipurile folosite pentru a construi aplicatii WCF.

In cadrul acestor assemblies sunt definite o serie de noi spatii de nume dintre care enumeram (cele

mai des folosite) :

System.Runtime.Serialization : contine clase ce pot fi utilizate pentru serializarea si deserializarea obiectelor.

Serializarea este procesul de conversie al unui obiect intr-o secventa liniara de bytes folosita in continuare fie pentru memorare, fie pentru transmitere la o alta locatie. Deserializarea este procesul invers ce consta din recrearea obiectelor din sirul de bytes primiti. Interfata ISerializable furnizeaza o metoda pentru clase de a controla comportarea serializarii acestora.

Clasele din spatiul de nume System.Runtime.Serialization.Formatters controleaza formatarea actuala a diferitelor tipuri de date incapsulate in obiectele serializate.

Clasele DataContractAttribute (aplicata la clase) si DataMemberAttribute (aplicata la date membru) sunt folosite in momentul cand cream servicii pentru a specifica ce membrii ai clasei trebuie serializati.

O alta clasa importanta este DataContractSerializer, folosita pentru a serializa sau deserializa instantele claselor ce au atributul DataContractAttribute si a membrilor acestora adnotati cu atributul DataMemberAttribute.

System.ServiceModel: contine clase, enumerari si interfete necesare pentru a construi un serviciu si aplicatii client ce pot fi folosite intr-un mediu distribuit de aplicatii.

System.ServiceModel.Configuration: citire fisiere de configurare.

System.ServiceModel.Description: contine tipuri, enumerari si interfete necesare pentru a construi si modifica descrierile serviciilor, contracte, endpoint-uri, etc.

System.ServiceModel.Security: controlul securitatii serviciilor in WCF.

System.ServiceModel.MsmqIntegration: contine tipuri necesare pentru integrarea cu servicii MSMQ.

Partile componente ale unui serviciu

(A, B, C) = (Adresa, Binding, Contract)

A = Adresa

In WCF, fiecare serviciu este asociat cu o adresa. Aceasta adresa furnizeaza urmatoarele informatii: locatia unde se gaseste serviciul ;

protocolul de transport sau schema de transport folosita pentru a comunica cu serviciul.

WCF suporta urmatoarele scheme de transport:

• HTTP

• TCP

• Peer network

• IPC (Inter-Process Communication peste pipe-uri cu nume)

• MSMQ

B = Binding

Binding defineste canalul folosit pentru a comunica cu un endpoint. Exista mai multe pattern-uri pentru comunicatie: mesaje sincrone cerere/raspuns sau asincrone de tip « trimite si nu asteaptraspuns » ;

mesaje bidirectionale ;

mesaje livrate imediat sau puse in coada ; cozile pot fi durabile sau volatile.

Protocoale de transport sunt: HTTP (sau HTTPS), TCP, P2P, IPC sau MSMQ. In ceea ce priveste codificarea mesajelor exista urmatoarele posibilitati : plain text pentru a permite interoperabilitate ; codificare binara pentru a optimiza performanta ;

MTOM (Message Transport Optimization Mechanism) pentru mesaje mari.

Securitate pentru mesaje : nesecurizate ; securitate la nivel de transport ; mesaj privat si securizat.

Pentru clienti exista posibilitati pentru autentificare si autorizare.

Mesajele trimise pot fi de incredere sau nu si pot fi procesate in ordinea in care au fost trimise sau in ordinea in care au fost receptionate. Toate aceste complexitati legate de comunicatie si optiunile existente fac constructia unui client si al unui serviciu sa fie neproductiva.

Pentru a simplifica aceste alegeri, WCF grupeaza impreuna o multime de aspecte de comunicatie in ceea ce se numeste binding-uri. In concluzie un binding contine o multime de alegeri in ceea ce priveste protocolul de transport, codificarea mesajelor, pattern-ul de comunicatie, increderea, securitatea, propagarea tranzactiilor si interoperabilitatea.

Se pot folosi binding-uri preconstruite in WCF sau putem scrie unul nou.

Serviciul publica binding-ul in metadata, ceea ce permite clientilor sa o citeasca si sa foloseasca aceleasi valori ca si serviciul. Un singur serviciu poate suporta binding-uri multiple pe adrese separate. Windows Communication Foundation - WCF

Binding-uri standard definite in WCF

Binding de baza

Oferit de clasa BasicHttpBinding, proiectat pentru a expune un serviciu WCF ca un serviciu web ASMX, deci clientii vechi vor putea folosi acest serviciu.

Elementul binding: basicHttpBinding.

Binding TCP

Oferit de clasa NetTcpBinding. Foloseste comunicatia TCP intre masini pe intranet. Suporta incredere, tranzactii si securitate si este optimizat pentru comunicare WCF –to-WCF. Este necesar ca atat clientul cat si serviciul sa foloseasca WCF.

Elementul binding: netTcpBinding.

Binding Peer network

Oferit de clasa NetPeerTcpBinding.

Elementul binding: netPeerTcpBinding.

Binding IPC

Oferit de clasa NetNamedPipeBinding, folosit in comunicarea pe aceeasi masina. Este cel mai sigur.

Elementul binding: netNamedPipeBinding.

Binding Web Service (WS)

Oferit de clasa WSHttpBinding, foloseste HTTP sau HTTPS pentru transport, si este proiectat sa ofere o varitate de trasaturi: incredere, tranzactii si securitate in Internet.

Elementul binding : wsHttpBinding.

Binding Federated WS

Oferit de clasa WSFederationHttpBinding, este o dezvoltare pentru binding WS si ofera suport pentru securitate pe masini diferite folosind “ticket” sau “token”.

Elementul binding: wsFederationHttpBinding.

Binding Duplex WS

Clasa WSDualHttpBinding. Este similar cu binding WS dar in plus suporta comunicarea bidirectionala. Windows Communication Foundation - WCF

Elementul binding: wsDualHttpBinding.

Binding MSMQ

Clasa NetMsmqBinding. Foloseste MSMQ pentru transport si este proiectat sa ofere suport pentru servicii ce folosesc cozi de mesaje. Nu e necesar ca apelatul sa fie online.

Elementul binding: netMsmqBinding.

Binding MSMQ integration

Clasa MsmqIntegrationBinding. Proiectata pentru a lucra cu vechii clienti MSMQ.

Elementul binding : msmqIntegrationBinding.

C = Contract

In WCF, toate serviciile expun contracte. Contractul este folosit pentru a descrie ceea ce face serviciul. WCF defineste patru tipuri de contracte:

Contracte pentru servicii - [ServiceContract]

Descrie operatiile din cadrul serviciului pe care le poate executa clientul.

Contracte de date - [DataContract]

Defineste tipurile de data ce sunt transferate la si de la serviciu. WCF defineste in mod implicit contracte pentru tipurile preconstruite int, string, etc. dar se pot defini in mod explicit contracte de date pentru tipuri custom. Un contract de date mapeaza tipurile CLR la XML Schema Definitions (XSD) si defineste cum sunt serializate si deserializate datele.

Contracte pentru erori - [FaultContract]

Defineste erorile semnalate de serviciu si modul cum serviciul manipuleaza si propaga erorile catre clienti.

Contracte pentru mesaj - [MessageContract] Permite serviciului sa interactioneze in mod direct cu mesajele. Contractele pentru mesaj pot fi cu tip sa fara tip. Se mapeaza tipurile CLR la mesajele SOAP si se descrie formatul mesajului SOAP si modul cum afecteaza definitiile WSDL si XSD ale acestor mesaje. Contractul pentru mesaj– furnizeaza un control precis asupra header-ului si corpului mesajului SOAP.

Elemente din WSDL

Element WSDL Descriere

Type :Definitiile tipurilor de date folosite pentru a descrie schimbul de mesaje. Acestea sunt sub forma unei scheme de definitie XML.

Message : Reprezinta o definitie abstracta a datelor ce vor fi transmise. Un mesaj consta din parti logice, fiecare parte fiind asociata cu o definitie din interiorul unui tip sistem. Un mesaj este similar unui parametru formal al unei functii si este folosit pentru a defini prototipul (signatura) operatiilor.

Operation : Un nume si o descriere a unei actiuni suportate de serviciu. Operatiile expun capabilitatea sau functionalitatea unui endpoint al serviciului.

PortType : Un endpoint din serviciu implementeaza un PortType, ce grupeaza operatii similare.

Binding : Defineste formatul mesajului si detaliile protocolului pentru operatiile si mesajele definite de un PortType particular

Endpoint-uri

Un serviciu este asociat cu:

A : adresa – unde e serviciul ;

B : un binding – cum comunicam cu serviciul;

C : un contract – ce face serviciul.

Acesta e ABC-ul serviciului. ABC-ul serviciului formeaza endpoint-ul

25. Ce este un Delegat? Ce reprezinta multicast delegate?

Un delegat este un tip referinta folosit pentru a ıncapsula o metoda cu un anumit antet (tipul parametrilor formali si tipul de retur). Orice metoda care are acest antet poate fi legata la un anumit delegat. Intr–un limbaj precumC++, acest lucru se rezolva prin intermediul pointerilor la functii. Delegatii rezolva aceeasi problema, dar ıntr–o maniera orientata obiect si cu garantii asupra sigurantei codului rezultat, precum si cu o usoara generalizare (vezi delegatii multicast).

Un delegat este creat dupa urmatoarea sintaxa:

atribute modificatori-de-delegat delegate tip-retur identificator( lista-param-formali);

Modificatorul de delegat poate fi: new, public, protected, internal, private. Un delegat se poate specifica atat ın interiorul unei clase, cat si ın exteriorul ei, fiind de fapt o declaratie de clasa derivata din System.Delegate. Daca este declarat ın interiorul unei clase, atunci este si static (asemanator cu statutul claselor imbricate).

MulticastDelegat:

Uneori este nevoie ca un delegat sa poata apela mai mult de o singura metoda. De exemplu, atunci cand un buton este apasat, se poate sa vrei sa efectuezi mai mult de o sigura actiune: sa scrii ıntr–un textbox un sir de caractere si sa ınregistrezi ıntr–un fisier faptul ca s–a apasat acel buton (logging). Acest lucru s–ar

putea rezolva prin construirea unui vector de delegati care sa contina toate metodele dorite, ınsa s-ar ajunge la un cod greu de urmarit si inflexibil; pentru un astfel de exemplu. Mult mai simplu ar fi daca unui delegat i s-ar putea atribui mai multe metode. Acest lucru se numeste multicasting si este folosit intens la tratarea evenimentelor.

Orice delegat care returneza void este un delegat multicast, care poate fi tratat si ca un delegat single-cast. Doi delegati multicast pot fi combinati folosind semnul +. Rezultatul unei astfel de “adunari” este un nou delegate multicast care la apelare va invoca metodele continute, ın ordinea ın care s–a facut adunarea. De exemplu, daca Writer si Logger sunt delegati care returneaza void, atunci urmatoarea linie va produce combinarea lor ıntr–un singur delegat:

myMulticastDelegate = Writer + Logger;

Se pot adauga delegati multicast folosind operatorul +=, care va adaugadelegatul de la dreapta operatorului la delegatul multicast aflat ın stanga sa: myMulticastDelegate += Transmitter;

26. Ce este serializarea?

Serializarea este procesul de conversie al unui obiect intr-o secventa liniara de bytes folosita in continuare fie pentru memorare, fie pentru transmitere la o alta locatie. Deserializarea este procesul invers ce consta din recrearea obiectelor din sirul de bytes primiti. Interfata ISerializable furnizeaza o metoda pentru clase de a controla comportarea serializarii acestora

27. Ce este CLR?

CLR este de departe cea mai importanta componenta a lui .NET Framework.

Este responsabila cu managementul si executia codului scris ın limbaje .NET, aflat ın format CIL; este

foarte similar cu Java Virtual Machine. CLR instantiaza obiectele, face verificari de securitate, depune

obiectele ın memorie, disponibilizeaza memoria prin garbage collection. In urma compil arii unei aplicatii

poate rezulta un fisier cu extensia exe, dar care nu este un executabil portabil Windows, ci un executabil

portabil.NET (.NET PE). Acest cod nu este deci un executabil nativ, ci se va rula de catre CLR, ıntocmai

cum un fisier class este rulat ın cadrul JVM. CLR foloseste tehnologia compilarii JIT

28. Ce este JIT?

JIT - o implementare de masina virtuala, ın care o metoda sau o functie, ın momentul ın care este apelata pentru prima oara, este tradusa ın cod masina. Codul translatat este depus ıntr-un cache, evitand-se astfel recompilarea ulterioara. Exista 3 tipuri de compilatoare JIT:

1. Normal JIT - a se vedea descrierea de mai sus.

2. Pre-JIT - compileaza ıntregul cod ın cod nativ singura data. In mod normal este folosit la instalari.

3. Econo-JIT - se foloseste pe dispozitive cu resurse limitate. Compileaza codul CIL bit cu bit, eliberand resursele folosite de codul nativ ce este stocat ın cache.

In esenta, activitatea unui compilator JIT este destinata a ımbunatati performanta executiei, ca alternativa la compilarea repetata a aceleia si bucati de cod ın cazul unor apelari multiple. Unul din avantajele mecanismului JIT apare ın clipa ın care codul, o data ce a fost compilat, se executa pe diverse procesoare; daca masina virtuala este bine adaptata la noua platforma, atunci acest cod va beneficia de toate optimizarile posibile, fara a mai fi nevoie recompilarea lui (precum ın C++, de exemplu).

29. Ce este IL?

Independent Languages: O data scrisa si compilata, orice aplicatie .NET (al carei management este facut de catre CLR) poate fi rulata pe orice platforma.

30. Ce este GAC?

Global Assembly Cache :-- Assemblies can be shared among multiple applications on the machine by registering them in global Assembly cache(GAC). GAC is a machine wide a local cache of assemblies maintained by the .NET Framework. We can register the assembly to global assembly cache by using gacutil command. We can Navigate to the GAC directory, C:\winnt\Assembly in explore. In the tools menu select the cache properties; in the windows displayed you can set the memory limit in MB used by the GAC

31. Ce este DLL HELL? Si cum poate fi rezolvat in .NET?

Ca o lectie ınvatata din perioada de “DLL Hell”, versionarea este acum un aspect de care se tine cont. Daca o aplicatie a fost dezvoltata si testata folosind anumite componente, instalarea unei componente de versiune mai noua nu va atenta la buna functionare a aplicatiei ın discutie: cele doua versiuni vor coexista pasnic, alegerea lor fiind facuta pe baza manifestelor.

32. Defineste un Singleton?

Pattern-ul Singleton este utilizat pentru a restrictiona numarul de instantieri ale unei clase la un singur

obiect. Atentie: Acest pattern ingreuneaza testarea aplicatiei, deoarece introduce stari globale.

Pattern-ul Singleton este in general utilizat in urmatoarele cazuri:

1. Ca parte integrata in Pattern-urile Abstract Factory, Builder, Prototype

2. Obiectele ce reprezinta stari sunt deseori Singleton-uri.

3. Singleton este preferat variabilelor globale deoarece:

nu polueaza namespace-ul global cu variabile nenecesare.

permite initializarea intarziata (lazy initialization) pentru a nu consuma inutil resursele

sistemului.

Din punct de vedere al design-ului si testarii unei aplicatii de multe ori se evita folosirea acestui pattern.

De exemplu daca avem nevoie sa mentinem o referinta catre un obiect in mai multe clase, putem sa il

facem Singleton si sa obtinem acel obiect in fiecare componenta in care avem nevoie de el sau ca sa

facem codul mai curat si cu un flow mai usor de urmarit, sa il instantiem doar intr-un singur loc si sa il

transmitem ca argument. Incercati sa nu folositi in exces metode statice (mai mult pt functii utility) si

componente Singleton.

Class Diagram

Implementare

La baza pattern-ului Singleton sta o metoda ce permite crearea unei noi instante a clasei daca aceasta nu

exista deja. Daca instanta exista deja, atunci intoarce o referinta catre acel obiect. Pentru a asigura o

singura instantiere a clasei, constructorul trebuie facut protected (un constructor privat impiedica

reutilizarea sa sau accesul unei unitati de testare).

Diferenta dintre o clasa cu atribute si metode statice si un Singleton este aceea ca Singleton-ul

permite instantierea lazy, utilizand memoria doar in momentul in care acest lucru este necesar deoarece instanta se creeaza atunci cand se apeleaza getInstance(). Inca un avantaj ar fi faptul ca o clasa

Singleton poate fi extinsa si metodele ei suprascrise, insa intr-o clasa cu metode statice acestea nu pot fi

suprascrise (overriden) (o discutie pe aceasta tema puteti gasi aici, si o comparatie intre static si dynamic

binding aici

Exemplu public class Singleton {   private static final Singleton INSTANCE = new Singleton();      // Private constructor prevents instantiation from other classes   private Singleton() {}

   public static Singleton getInstance() {      return INSTANCE;   } }

Factory Pattern

Patternul Factory face parte din categoria Creational Patterns si ca atare rezolva problema crearii unui

obiect fara a specifica exact clasa obiectului ce urmeaza a fi creat. Acest lucru este implementat prin

definirea unei metode al carei scop este crearea obiectelor. Metoda va avea specificat ca parametru de

intors in antet un obiect de tip parinte, urmand ca, in functie de alegerea programatorului, aceasta sa

creeze si sa intoarca obiecte noi de tip copil.

Exemplu

Situatia cea mai intalnita in care se potriveste acest pattern este aceea cand trebuie instantiate multe

clase care implementeaza o anumita interfata sau extind o alta clasa (eventual abstracta), ca in exemplul

de mai jos. Clasa care foloseste aceste subclase nu trebuie sa "stie" tipul lor concret ci doar pe al

parintelui.

Exemplu de utilizare impreuna cu Singleton

De ce am avea nevoie de aceasta combinatie?

De obicei avem nevoie ca o clasa factory sa fie utilizata din mai multe componente ale aplicatiei. Ca

sa economisim memorie este suficient sa avem o singura instanta a factory-ului si sa o folosim pe

aceasta. Folosind pattern-ul Singleton putem face clasa factory un singleton, si astfel din mai multe

clase putem obtine instanta acesteia si cu ajutorul acesteia sa obtinem/sa fie create instante ale unor

resurse ale caror tip nu este cunoscut codului ce le utilizeaza.

Un exemplu ar fi Abstract Window Toolkit (AWT). java.awt.Toolkit este o clasa abstracta ce face

legatura dintre componentele AWT si implementarile native din toolkit. Clasa Toolkit are o metoda factory

Toolkit.getDefaultToolkit() ce intoarce subclasa de Toolkit specifica platformei. Obiectul Toolkit este un

Singleton deoarece AWT are nevoie de un singur obiect pentru a efectua legaturile si deoarece un astfel

de obiect este destul de costisitor de creat. Metodele trebuie implementate in interiorul obiectului si nu pot

fi declarate statice deoarece implementarea specifica nu este cunoscuta de componentele independente

de platforma.

Observer Pattern

Design Pattern-ul Observer defineste o relatie de dependenta 1..* intre obiecte astfel incat cand un obiect

isi schimba starea, toti dependentii lui sunt notificati si actualizati automat. Implica existenta unui obiect

denumit subiect care are asociata o lista de obiecte dependente, numite observatori, pe care le apeleaza

automat de fiecare data cand se intampla o actiune.

Acest pattern este de tip Behavioral (comportamental), deorece faciliteaza mai buna organizare a

comunicatiei dintre clase in functie de rolurile/comportamentul acestora.

Motivatie

Design pattern-ul Observer se foloseste in cazul in care mai multe clase(observatori) depind de

comportamentul unei alte clase(subiect), in situatii de tipul:

o clasa implementeaza/reprezinta logica, componenta de baza, iar alte clase doar folosesc rezultate

ale acesteia (monitorizare).

o clasa efectueaza actiuni care apoi pot fi reprezentate in mai multe feluri de catre alte clase (view-uri

ca in figura de mai jos).

Practic in toate aceste situatii clasele Observer observa modificarile/actiunile clasei Subject. Observarea se implementeaza prin notificari initiate din metodele clasei Subject. De exemplu inlaboratorul 6,

clasa MyArrayList era observata pentru evenimentele de adaugare si stergere din lista.

Structura

Figura de mai jos ofera un exemplu de baza de structurare al aplicatiei astfel incat sa se foloseasca

observatori.

Subject

cunoaste observatorii (numar arbitrar)

subiectul nu trebuie sa stie ce fac observatorii, trebuie doar sa ii cunoasca si sa ii notifice.

ca implementare:

trebuie sa ofere o metoda prin care primeste referinte catre obiecte de tip observator, eventual si

o metoda prin care se pot deinregistreaza observatori

trebuie sa pastreze referintele observatorilor si sa apeleze metodele de notificare oferite de

interfata acestora

Observer

defineste o interfata de actualizare a obiectelor ce trebuie notificate de schimbarea subiectelor

ca implementare:

toti observatorii pentru un anumit subiect trebuie sa implementeze aceasta interfata

metoda (metode) ce sunt invocate de subiect pentru notifica o schimbare. Ca argumente se

poate primi chiar instanta subiectului sau obiecte speciale care reprezinta evenimentul ce a

provocat schimbarea (ca in exemplul de la MyArrayList din laboratorul 6).

View

implementeaza interfata Observator

Aceasta schema se poate extinde, in functie de scopul dorit - observatorii pot tine referinte catre subiect

sau putem adauga clase speciale pentru reprezentarea evenimentelor, notificarilor

33. Defineste Factory Method?

Factory Method definește o interfață responsabilă cu crearea obiectelor, dar subclasele decid ce clasă este instanțiată.

34. Repository pattern?

Factory este unul dintre cele mai folosite patterns și este un obiect ce creează alte obiecte, cu alte cuvinte creem obiecte fără a specifica exact clasa obiectului. Factory pattren face parte din categoria Creational Patterns și-l găsim sub două forme: Factory Method și Abstract Factory.

Abstract Factory definește o interfață pentru crearea unei familii de obiecte legate sau dependente, specializate în rezolvarea aceleași probleme dar în moduri diferite și fără să se specifice concret clasele acelor obiecte.

35. MVC? MVP? MVVM?

Model-view-controller (MVC) (din engleză, aproximativ: model-față-controlor) este un model arhitectural

utilizat în ingineria software. Succesul modelului se datorează izolării logicii de business față de

considerentele interfeței cu utilizatorul, rezultând o aplicație unde aspectul vizual sau/și nivelele inferioare

ale regulilor de business sunt mai ușor de modificat, fără a afecta alte nivele.

Arhitectură

Model

Această parte a controlatorului manipulează operațiunile logice și de utilizare de informație (trimisă

dinainte de către rangul său superior) pentru a rezulta de o formă ușor de înțeles.

View

Acestui membru al familiei îi corespunde reprezentarea grafică, sau mai bine zis exprimarea ultimei forme

a datelor: interfața grafică ce interacționează cu utilizatorul final. Rolul său este de a evidenția informația

obținută până ce ea ajunge la controlator.

Controler

Cu acest element putem controla accesul la aplicația noastră. Pot fi fișiere, scripts sau programe; orice tip

de informație permisă de interfață. În acest fel putem diversifica conținutul nostru de o formă dinamică și

statică, în același timp.

Structură

Cu ajutorul Controlatorului, modelului sau a viziunii putem manipula următoarele elemente: date. Depinde

de noi cum manipulăm și interpretăm aceste "date". Acum cunoaștem că unicele date ale unei adrese

web statice este: obținerea unui fișier în discul dur (hard disk) sau din Internet, etc. și, interpretat

(recunoscut/decodificat) sau nu, serverul răspunde.

Modelul, precum controlatorul și viziunea manipulează toate datele ce se relaționeză cu el. Și numai

Viziunea poate demonstra această informație. În acest fel am demonstrat ierarhia programului nostru:

Controlator-Model-Viziune.

MVP:

MVP is a user interface architectural pattern engineered to facilitate automated unit testing and improve

the separation of concerns in presentation logic:

The model is an interface defining the data to be displayed or otherwise acted upon in the user

interface.

The view is a passive interface that displays data (the model) and routes user commands (events) to

the presenter to act upon that data.

The presenter acts upon the model and the view. It retrieves data from repositories (the model), and

formats it for display in the view.

MVVM

Model: as in the classic MVC pattern, the model refers to either (a) a domain model which

represents the real state content (an object-oriented approach), or (b) the data access layer that

represents that content (a data-centric approach).

View: as in the classic MVC pattern, the view refers to all elements displayed by the GUI such as

buttons, labels, and other controls.

View model: the view model is a “model of the view” meaning it is an abstraction of the view that

also serves in mediating between the view and the model which is the target of the view data

bindings.

Logică

Pentru o aplicație web ușoara este necesar să stabilim aceste elemente:

O bază (MVC)

1. Controlator - acesta trebuie să fie capabil de a manipula rute, fișiere, clase, metode și funcții

2. Model - este semănător unui script obișnuit într-un server, doar că regrupat sub un model

reutilizabil.

3. Viziune - asemănător includerii unui fișier în aplicația noastră.

36. Ce este WPF? Ce este un XAML?

WPF sau Windows Presentation Foundation este o parte integranta a .Net Framework, incepand cu versiunea 3.0, folosita pentru crearea interfatei grafice a aplicatiilor Windows. Noutatea adusa de aceasta tehnologie produsa de Microsoft, in prezent ajunsa la versiunea 4.0, este implicarea unui markup-language, denumit XAML,  asemantor cuXML, care simplifica munca programatorului in ceea ce priveste construirea interfatei grafice.

XAML

Numele vine de la eXtensible Application Markup Language, sintaxa fiind XML. Ce face XAML? Păi cu XAML poți descrie cam tot ce înseamnă element vizual în documente, interfețe grafice de aplicații și, bineînțeles, în Silverlight.Specificatia XAML defineste reguli ce mapeaza spatiile de nume din .NET, tipuri, proprietati si evenimente in spatii de nume XML, elemente si atribute.

XAML este bazat pe XML. Exista o mapare a tipurilor din CLR la tag-urile din XML, de la atributele din XML la proprietatile si evenimentele din CLR

37. Boxing? Unboxing?

Boxing si unboxing - motivul pentru care exista tipuri primitive este acelasi ca si ın Java: performanta. Insa orice variabila ın .NET este compatibila cu clasa Object, radacina ierarhiei existente ın .NET. De exemplu, int este un alias pentru System.Int32, care se deriveaza din System.ValueType. Tipurile valoare se stocheaza pe stiva, dar pot fi oricand convertite ıntr-un tip referinta memorat ın heap; acest mechanism se numeste boxing. De exemplu:

int i = 1; //i - un tip valoare

Object box = i; //box - un obiect referinta

Cand se face boxing, se obtine un obiect care poate fi gestionat la fel ca oricare altul, facandu–se abstractie de originea lui.

Inversa boxing-ului este unboxing-ul, prin care se poate converti unobiect ın tipul valoare echivalent, ca mai jos:

int j = (int)box; unde operatorul de conversie este suficient pentru a converti de la un obiect la o variabila de tip valoare.

38. Transimiterea prin valoare? Transmiterea prin referinta?

Tipuri valoare - ın general, CLR-ul (care se ocupa de managementul si executia codului CIL, vezi mai jos) suporta doua tipuri diferite: tipuri valoare si tipuri referinta. Tipurile valoare reprezinta tipuri allocate pe stiva si nu pot avea valoare de null. Tipurile valoare includ tipurile primitive, structuri ¸si enumerari. Datorita faptului ca de regula au dimensiuni mici si sunt alocate pe stiva, se manipuleaza eficient, reducand overhead-ul cerut de mecanismul de garbage collection.

Tipuri referinta - se folosesc daca variabilele de un anumit tip cer resurse de memorie semnificative. Variabilele de tip referinta contin adrese de memorie heap si pot fi null. Transferul parametrilor se face rapid, dar referintele induc un cost suplimentar datorita mecanismului de garbage collection.

Tipurile valoare

In articolul Tipuri valoare am expus clasificarea acestora. Conform documentatiei SDK .Net, tipul valoare poate fi reprezentat de o structura (struct) sau de o enumerare (enum). De exemplu, structuri ca System.Int32 sau System.Boolean,Sytem.DayOfWeek sunt tipuri valoare. Este importantat de mentionat ca toate structurile si enumerarile deriva din tipul abstract System.ValueType care la randul lui deriva din clasa de baza System.Object.

Un tip valoare nu poate fi folosit ca baza pentru crearea unui alt tip valoare, toate tipurile valoare fiind sealed. Prin urmare, programatorul nu isi poate crea un tip valoare pornind de la un tip de baza ca Boolean sau Char. De aceea, un tip valoare nu poate avea membri abstracti. Urmatorul cod va genera eroare la compilare: The modifier ‘abstract’ is not valid for this item. In schimb, un tip valoare poate implementa una sau mai multe interfete.

Tipul valoare nu este supus GC, el se termina o data cu metoda, nu accepta finalizer si nu este referentiat de un pointer.

Tipurile referinta

Despre tipurile referinta s-a discutat in articolul Tipurile referinta. Ele sunt reprezentate de clase, interfete, delegati, siruri de caractere si tipul object (tipul de baza).

Tipurile referinta stocheaza in stack pointer-ul catre date, date care sunt stocate in heap. Memoria alocata tipurilor referinta este in heap, ceea ce poate conduce la o declansare a GC.

Asignarea unei variabile de tip referinta catre o alta instanta de tip de tip referinta va crea o copie care va referi aceeasi locatie din heap.

Tip valoarea sau tip referinta?

In procesul de proiectare al propriilor tipuri de date, programatorul trebuie sa aleaga cu atentie intre cele doua tipuri. Astfel, cateva situatii ce recomanda tipurile valoare pentru crearea unui tip nou: o mai buna performanta intrucat nu sunt alocate in heap tipul este simplu, immutable (sa nu aiba membri ce pot modifica campurile) tipul nu este tip de baza si nu mosteneste un alt tip marimea instantei este relativ mica, mai mica de 16 biti marimea instantei este mare, dar tipul nu este este folosit in transmiterea parametrilor sau ca tip returnat (transmiterea parametrilor se face implicit prin valoare, ceea ce inseamna copierea valorilor campurilor si afectarea performantei)

Aceste doua tipuri de date prezentate de C# creeaza un paradox: in bibliotecile puse la dispozitie de FCL tipurile de referinta sunt cele mai intalnite, dar tipurile valoare sunt cele mai folosite de programatori. Chiar daca pentru dezvoltatorii de unmanaged C/C++ aceasta clasificare poate parea ciudata, ea contribuie la performanta aplicatiei.

Sa ne imaginam cum ar fi fost daca pentru fiecare int cerut de programator ar fi avut loc intregul proces de alocare in memoria heap.

1. Fundamentele WPF

WPF – Fundamente

Ierarhia de clase (cea mai des folosita)

Object – clasa de baza pentru toate clasele din .NET.

DispatcherObject – clasa de baza folosita de orice obiect ce doreste sa fie accesat numai din firul care l-a creat.

DependencyObject – clasa de baza pentru orice obiect ce suporta proprietati dependente, una din caracteristicile principale ale WPF.

Freezable – clasa de baza pentru obiecte ce pot fi « inghetate » intr-o stare read-only din motive de performanta. Poate fi accesata de fire multiple. Nu-si poate schimba starea dar poate fi clonata. Exemple : primitive grafice – pensoane, penite, clase pentru geometrii si animatii.

Visual – clasa de baza pentru obiectece au reprezentare vizuala 2D.

UIElement – clasa de baza pentru toate obiectele vizuale 2D ce suporta evenimente rutate, asociere de comenzi, layout si focus.

Visual3D – clasa de baza pentru toate obiectele ce au reprezentare vizuala 3D.

UIElement3D – clasa de baza pentru toate obiectele vizuale 3D ce suporta evenimente rutate, asociere de comenzi, focus.

ContentElement – O clasa de baza similara cu UIElement dar pentru parti de document ale continutului ce nu au o redare proprie. ContentElement este gazduit intr-o clasa derivata din Visual pentru a fi redata pe ecran.

FrameworkElement - clasa de baza ce adauga suport pentru stiluri, data binding, resurse si un mecanism pentru controalele windows cum ar fi tooltips si meniul contextual.

FrameworkContentElement – analog cu FrameworkElement pentru continut.

Control – clasa de baza pentru controalele obisnuite Button, ListBox si StatusBar.

Adauga proprietati precum Foreground, Background si FontSize precum si abilitatea de a fi restilizate.

2. Ce Reprezinta data trigger?

Pe langa “property trigger”, WPF suporta “data trigger” si “event trigger”.

Data trigger este o proprietate ce lucreaza pentru toate proprietatile .NET (nu numai pentru proprietati dependente). Modificarile unei date pot afecta alte controale din interfata. Clasa DataTrigger. Este legata si de asocierea datelor la controale (data binding).

Event trigger – permite sa specificam in mod declarativ actiunile ce vor fi executate cand apare un eveniment

3. Ce reprezinta un Dependecy Property?

Reprezinta o proprietate ce poate fi setata prin metode utilizate in stilizare, data binding, animatie si mostenire.

4. Enumarati cateva panels in WPF?

WrapPanel, StackPanel, Canvas, Grid

5. Ce este un style? Exemple?

Cu style putem face un setter la propietati, putem define triggere. De exemplu putem schimba background-ul utilizand .

6. CE este un template? Exemple?

The template is defined by a dependency property called Template. By setting this property to another instance of a control template, you can completely replace the appearance (visual tree) of a control.

7. Ce este un Converter? Exemple?

If you want to databind two properties that have incompatible types, you need a piece of code in between, that converts the value from source to target type and back. This piece of code is called ValueConverter. A value converter is a class, that implements the simple interface IValueConverter with the two methods object Convert(object value)and object ConvertBack(object value).

First thing you need to do is to map the namespace of your converter to a XAML namespace. Then you can create an instance of a value converter in the resources of the view and give it a name. Then you can reference it by using{StaticResource}

If you want to use a normal ValueConverter in XAML, you have to add an instance of it to the resources and reference it by using a key. This is cumbersome, because and the key is typically just the name of the converter.

A simple and cool trick is to derive value converters from MarkupExtension. This way you can create and use it in the binding like this: Text={Binding Time, Converter={x:MyConverter}}, and that is quite cool!

The StringFormatConverter is a useful converter to control the format of an implicit string conversion of an object (e.g. if you bind a DateTime to a TextBlock ).

8. Routarea evenimeentelor in WPF?

Routed Events

Routed events are events which navigate up or down the visual tree acording to their RoutingStrategy. The routing strategy can be bubble, tunnel or direct. You can hook up event handlers on the element that raises the event or also on other elements above or below it by using the attached event syntax: Button.Click="Button_Click".

Routed events normally appear as pair. The first is a tunneling event called PreviewMouseDown and the second is the bubbling called MouseDown. They don't stop routing if the reach an event handler. To stop routing then you have to sete.Handled = true;

Tunneling The event is raised on the root element and navigates down to the visual

tree until it reaches the source element or until the tunneling is stopped by marking

the event as handeld. By naming convention it is calledPreview... and appears

before corresponding bubbling event.

Bubbling The event is raised on the source element and navigates up to the visual

tree until it reaches the root element or until the bubbling is stopped by marking the

event as handled. The bubbling event is raised after the tunneling event.

Direct The event is raised on the source element and must be handled on the source

element itself. This behavior is the same as normal .NET events.

How to Create a Custom Routed Event  // Register the routed eventpublic static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent( "Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyCustomControl)); // .NET wrapperpublic event RoutedEventHandler Selected{ add { AddHandler(SelectedEvent, value); } remove { RemoveHandler(SelectedEvent, value); }} // Raise the routed event "selected"RaiseEvent(new RoutedEventArgs(MyCustomControl.SelectedEvent)); 

9. Ce este Data Binding?

DataBinding in WPF

IntroductionWPF provides a simple and powerful way to auto-update data between the business model and the user interface. This mechanism is called DataBinding. Everytime when the data of your business model changes, it automatically reflects the updates to the user interface and vice versa. This is the preferred method in WPF to bring data to the user interface.

Databinding can be unidirectional (source -> target or target <- source), or bidirectional (source <-> target).

The source of a databinding can be a normal .NET property or a DependencyProperty. The target property of the binding must be a DependencyProperty.

To make the databinding properly work, both sides of a binding must provide a change notification that tells the binding when to update the target value. On normal .NET properties this is done by raising the PropertyChanged event of theINotifyPropertyChanged interface. On DependencyProperties it is done by the PropertyChanged callback of the property metadata

Databinding is typically done in XAML by using the {Binding} markup extension. The following example shows a simple binding between the text of a TextBox and a Label that reflects the typed value:

 <StackPanel> <TextBox x:Name="txtInput" /> <Label Content="{Binding Text, ElementName=txtInput, UpdateSourceTrigger=PropertyChanged}" /></StackPanel>  

DataContextEvery WPF control derived from FrameworkElement has a DataContext property. This property is meant to be set to the data object it visualizes. If you don't explicity define a source of a binding, it takes the data context by default.

The DataContext property inherits its value to child elements. So you can set the DataContext on a superior layout container and its value is inherited to all child elements. This is very useful if you want to build a form that is bound to multiple properties of the same data object.

 <StackPanel DataContext="{StaticResource myCustomer}"> <TextBox Text="{Binding FirstName}"/> <TextBox Text="{Binding LastName}"/> <TextBox Text="{Binding Street}"/> <TextBox Text="{Binding City}"/></StackPanel>  

ValueConvertersIf you want to bind two properties of different types together, you need to use a ValueConverter. A ValueConverter converts the value from a source type to a target type and back. WPF already includes some value converters but in most cases you will need to write your own by implementing the IValueConverter interface.

A typical example is to bind a boolean member to the Visibility property. Since the visibility is an enum value that can be Visible, Collapsed or Hidden, you need a value converter.

 <StackPanel> <StackPanel.Resources> <BooleanToVisibilityConverter x:Key="boolToVis" /> </StackPanel.Resources>  <CheckBox x:Name="chkShowDetails" Content="Show Details" /> <StackPanel x:Name="detailsPanel" Visibility="{Binding IsChecked, ElementName=chkShowDetails, Converter={StaticResource boolToVis}}"> </StackPanel></StackPanel>  

The following example shows a simple converter that converts a boolen to a visibility property. Note that such a converter is already part of the .NET framework.

 

public class BooleanToVisibilityConverter : IValueConverter{ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is Boolean) { return ((bool)value) ? Visibility.Visible : Visibility.Collapsed; }  return value; }  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }}  Tip: you can derive your value converter from MarkupExtension and return its own instance in the ProvideValueoverride. So you can use it directly without referencing it from the resources.

Another Tip: When you get the error "No constructor for type '...' has 0 parameters.", you need to add an default constructor to your converter, even it's not needed. Just for the WPF designer.

10. Ce este reflection?

Spaţiul de nume System.Reflection din biblioteca FCL conţine o serie de tipuri, care permit scrierea unui cod care să permită analiza (reflexia) acestor tabele de metadate. De fapt, tipurile din acest spaţiu de nume oferă un model de obiect pentru metadatele conţinute într-un assembly sau modul. Prin utilizarea acestor tipuri de modele de obiecte, putem cu uşurinţă enumera toate tipurile dintr-un tabel de definiţie a metadatelor. Apoi, pentru fiecare tip, putem obţine tipul de bază, interfaţa pe care o implementează şi indicatorii asociaţi.

Tipurile suplimentare din spaţiul de nume System.Reflection permit interogarea:

- câmpurilor,- metodelor;- proprietăţilor;- evenimentelor

prin analiza tabelelor de metadate corespunzătoare.

De obicei reflexia este utilizată pentru bibliotecile de clase, care trebuie să înţeleagă definiţia unui tip, pentru a oferi o funţionalitate oarecare consistentă. De exemplu, mecanismul de serializare din biblioteca FCL utilizează reflexia, pentru a determina ce câmpuri defineşte un tip. Formatorul serializării poate obţine apoi valorile acestor câmpuri, pe care le poate scrie într-un stream de octeţi, pentru a le expedia prin reţea.

Reflexia este utilizată şi atunci când, pentru a realiza o sarcină oarecare, o aplicaţie trebuie să încarce un tip, dintr-un anumit assembly, în timpul rulării. De exemplu, o aplicaţie ar putea să-i ceară utilizatorul numele assembly-ului şi un anumit tip definit intr-un spaţiu de nume din assembly. Apoi aplicaţia ar putea încărca explicit assembly-ul, ar putea construi o instanţă a tipului respectiv şi ar putea apela metodele acestuia. Asocierea tipurilor şi apelarea metodelor în acest mod se numeşte asociere întârziată. (asocierea timpurie are loc atunci când tipurile şi metodele utilizate de o aplicaţie sunt determinate în timpul compilării).