Sunteți pe pagina 1din 51

Intrebari C# cruce ASP.

NET
1.Ce inseamna internal, protected, public, private?

Caracteristicile comune limbajelor care implementeaza programarea pe obiecte sunt:


incapsularea, polimorfism, mostenirea. Despre ultimele doua notiuni, vom discuta in
urmatoarele doua articole.
Incapsularea e un mecanism care combina codul si datele mentinandu-le
integritatea in timpul utilizarii. Din aceasta combinatie, se creeaza obiectul. Tot la nivelul
incapsularii se defineste nivelul de acces la datele unui obiect.
In cadrul unui obiect, codul si datele pot fi private sau public. Cand sunt private,
ele sunt vizibile si accesibile doar in interiorul obiectului. In cazul public, celelalte parti
ale programului le pot utiliza.
Forma unui obiect este definata de clasa. Datele care constituie o clasa sunt
denumite variabile membri. Codul care opereaza asupra datelor este numit metoda .
Metoda implementeaza o actiune, poate admite parametri si returna valori de tip
predefinit, de tip obiect sau tipul void (nimic). Un parametru sau argument este o
valoare transmisa unei metode, cu valabilitate in corpul functiei.

modificator
access

Explicatii

public

access nelimitat
acces permis doar in clasa sau spatiul de nume in

internal

care e cuprinsa

protected

acces in clasa curenta sau in cele derivate

private

implicit.Doar pentru clasele interioare

protected

folosit pentru clasele interioare semnificand accesul

internal

in clasa care-l contine sau in tipurile derivate din

- Vertraulich / Confidential -

clasa care-l contine


Atat datele cat si metodele pot avea modificatori de acces:
modificator access

explicatie

public

membrul accesibil de oriunde


accesbil doar intr-un bloc

internal

functional al unei aplicatii .Net


accesibil oricarui membru al clasei
care-l contine si al claselor

protected

derivate
implicit. acces permis doar pentru

private

clasa care contine membrul


accesibil oricarui membru al al
clasei care il contine si al claselor
derivate, precum si in blocul

protected internal

functional

2. Ce inseamana lock?(Cu ce este echivalent lock?)

In lucrul cu multithreading-ul apare o problema majora, cea a sincronizarii: mai multe fire
de executii acceseaza acelasi obiect, simulan. Solutia vine de la lock: atunci cand
primul thread acceseaza obiectul, il va tine ocupat pana la incheiere.
Folosirea firelor de executie permite rularea proceselor simultan, dar acest lucru poate
incetini executia programului, daca nu sunt folosite cu atentie.
O aplicatie C# poate deveni multi-threading in doua moduri: fie explicit prin crearea si
rularea firelor de executie, fie prin folosirea unor caracteristici ale .Net care creeaza

- Vertraulich / Confidential -

implicit thread-uri: BackgroundWorker, thread pooling sau la construirea unui Web


Service sau unei aplicatii Asp.Net.

3. Care este diferenta fundamentala dintre SQLAdapter si SqlDataReader?

SqlDataReader
Tipul SqlDataReader este folosit pentru a citi date in cea mai eficienta metoda posibila.
NU poate fi folosit pentru scriere.
O data citita o informatie nu mai poate fi citita inca o data.
SqlDataReader citeste secvential date.
Datorita faptului ca citeste doar inainte (forward-only) permite acestui tip de date sa fie
foarte rapid in citire.
Overhead-ul asociat este foarte mic (overhead generat cu inspectarea rezultatului
si a scrierii in baza de date). Daca intr-o aplicatie este nevoie doar de informatii care vor
fi citite o singura data, sau rezultatul unei interogari este prea mare ca sa fie retinut in
memorie (caching) SqlDataReader este solutia cea mai buna.
Obtinerea unei instante de tipul SqlDataReader este putin diferita de instantierea normala
- trebuie apelata metoda ExecuteDataReader. Daca pentru instantiere este folosit
operatorul new veti obtine un obiect cu care nu puteti face nimic pentru ca nu are o
conexiune si o comanda atasate.
SqlDataReader obtine datele intr-un stream secvential. Pentru a citi aceste informatii
trebuie apelata metoda Read; aceasta citeste un singur rand din tabelul rezultat. Metoda
clasica de a citi informatia dintr-un SqlDataReader este de a itera intr-o bucla while asa
cum se vede in figura 4
la liniile 32-35.
Metoda Read intoarce true cat timp mai este ceva de citit din stream.
SqlDataReader implementeaza si indexatori (am obtinut prima coloana in exemplul din
figura 4
folosind indexatori numerici). In exemplul din figura 4 nu este foarte clar pentru cineva
care
citeste codul ca acolo este vorba de coloana CustomerID (decat daca s-a uitat si in baza
de date).
Din aceasta cauza este preferata utilizarea indexatorilor de tipul string. In acest caz codul
devine:
// Obtine rezultatul interogarii
rdr = cmd.ExecuteReader();
// Afiseaza valoarea CustomerID a fiecarei inregistrari
while (rdr.Read())
{
Console.WriteLine (rdr["CustomerID"]);
}
Fig. 8: Folosirea indexatorilor asupra unui SqlDataReader.
Valoeare indexului trebuie sa fie numele coloanei din tabelul rezultat.
Indiferent ca se foloseste un index numeric sau unul de tipul string indexatorii intorc
totdeauna un obiect de tipul object fiind necesara conversia.
Dupa ce un reader nu mai este folosit acesta trebuie inchis apeland metoda Close
SqlDataAdapter

- Vertraulich / Confidential -

Pana acum am vazut cum putem efectua operatii asupra unei baze de date folosind
obiecte de tipul SqlCommand si SqlDataReader. Problema cu aceasta abordare este ca pe
parcursul intregii tranzactii conexiunea trebuie sa fie deschisa.
Voi prezenta in continuare o metoda care nu necesita o conexiune permanenta la o baza
de date - si anume folosind obiecte de tipul DataSet si SqlDataAdapter.
Un DataSet este o reprezentare in memorie a unui data store (un sistem de stocare si
obtinere a datelor). Un DataSet contine o multime de tabele asupra carora se pot executa
diverse operatii.
Un DataSet doar retine informatii si nu interactioneaza cu un data source.
SqlDataAdapter este cel care se ocupa administrarea conexiunilor cu data source si ofera
comportamentul de lucru in mod deconectat. SqlDataAdapter deschide o conexiune doar
atunci cand este nevoie si o inchide imediat ce si-a terminmat treaba. De exemplu
SqlDataAdapter realizeaza urmatoarele
operatiuni atunci cand trebuie sa populeze un DataSet:
1. deschide conexiunea;
2. populeaza DataSet-ul;
3. inchide conexiunea;
si urmatoarele operatiuni atunci cand trebuie sa faca update in baza de date:
1. deschide conexiunea;
2. scrie modificarile din DataSet in baza de date;
3. inchide conexiunea;
Intre operatiunea de populare a DataSet-ului si cea de update conexiunile la data source
sunt inchise.
Intre aceste operatii in DataSet se poate scrie sau citi. Acestea sunt mecanismele de a
lucra in mod deconectat. Pentru ca aplicatia tine deschisa conexiunea la baza de date
doar atunci cand este necesar, devine mai scalabila.
4. Poate avea un thread parametri?
Da.

Cel mai simplu mod de a crea un thread este sa instantiem un obiect Thread, al carui
constructor va cere ca parametru un delegate de tipul ThreadStart. Delegatul va indica
ce metoda va rula in thread.
Adaugam namespace-ul, mai intai:
usingSystem.Threading;
classNumara
{
//numara pana la 10
publicvoidZece()
{
Console.WriteLine("Simple Thread");
for(inti=0;i<=10;i++)
{
Console.WriteLine(i);
}
}
}
in main():
Numaranumara=newNumara();
//obiectul Thread
Threadthread1=newThread(newThreadStart(numara.Zece));
- Vertraulich / Confidential -

threaUnu.Start();

Codul de mai sus nu reflecta puterea firelor de executie multiple, pentru ca avem doar
unul. O sa adaugam inca un thread, o sa setam numele pentru o identificare mai usoara
si vom folosi proprietatea CurrentThread care va returna firul de executie curent.
//obiectul Thread
Threadthread1=newThread(newThreadStart(numara.Zece));
Threadthread2=newThread(newThreadStart(numara.Zece));
thread1.Name="Thread One";
thread2.Name="Thread Two";
thread1.Start();
thread2.Start();
publicvoidZece()
{
for(inti=0;i<=10;i++)
{
Console.WriteLine("{0},numara :
{1}",Thread.CurrentThread.Name,i);
}
}
5. Ce reprezinta remoting?
C# Remoting Architecture
The .NET Remoting provides an inter-process communication between Application
Domains by using Remoting Framework. The applications can be located on the same
computer , different computers on the same network, or on computers across separate
networks. The .NET Remoting supports distributed object communications over the TCP
and HTTP channels by using Binary or SOAP formatters of the data stream.
The main three components of a Remoting Framework are :
1. C# Remotable Object
2. C# Remote Listener Application - (listening requests for Remote Object)
3. C# Remote Client Application - (makes requests for Remote Object)

- Vertraulich / Confidential -

6. Ce reprezinta un WebService?
Un serviciu Web (Web Service) este o aplicatie Web de tip client-server, n care un server
furnizor de servicii (numit si "Service Endpoint") este accesibil unor aplicatii client (care
nu sunt de tip browser) pe baza adresei URL a serviciului. Serviciul Web si clientii si pot
rula pe platforme diferite si pot fi scrise n limbaje diferite,deoarece se comunic prin
protocoale standard HTTP, XML, SOAP, JSON, s.a. De aceea principalul merit al serviciilor
Web este acela c asigur interoperabilitatea unor aplicatii software implementate pe
platforme diferite si cu instrumente (framework-uri) diferite. In acelasi timp aplicatiile
sunt slab cuplate (loosely coupled), n sensul c mesajele schimbate sunt standard
(self-contained) si oricare dintre aplicatii nu presupune existenta la cellalt capt a
altor facilitti dect cele continute n standarde.
Din punct de vedere al tehnologiilor folosite exist dou tipuri de servicii Web:
- Servicii de tip REST ( RESTful Web Services), n care cererile de la client se exprim
prin comenzi HTTP (GET, PUT, POST,DELETE), iar rspunsurile sunt primite ca documente
XML sau JSON;
- Servicii de tip SOAP (Simple Object Access Protocol), n care cererile si rspunsurile au
forma unor mesaje SOAP (documente XML cu un anumit format) transmise tot peste
HTTP. In astfel de servicii furnizorul expune si o descriere a interfetei API sub forma unui
document WSDL (Web Service Description Language), care este tot XML si poate fi
prelucrat de client. Un client trebuie s cunoasc metodele oferite de ctre Service
Endpoint, pe care le poate afla din descrierea WSDL.
Serviciile de tip SOAP ofer mai mult flexibilitate, o mai bun calitate a serviciilor si
interoperabilitate dect serviciile REST si sunt recomandate pentru un API mai mare
oferit clientilor. Serviciile de tip SOAP pot fi combinate pentru realizarea de operatii
complexe, ceea ce a condus la o arhitectur orientat pe servicii (SOA=Service Oriented
Architecture).
7. Ce este ViewState? Care sunt dezavantajele de la ViewState?
Controalele ASP.NET au o proprietate extrem de important din punct de vedere al
performanei: i pstreaz starea ntre postback-uri. ViewState-ul, cci despre el e
vorba, ne ajut din acest punct de vedere, dar prezint i dezavantaje care vin cu
stocarea strii controalelor: dimensiunea paginii este mai mare, valorile trebuie
serializate / deserializate la salvare / citire din ViewState, etc. Partea bun a lucrurilor
este faptul c ViewState-ul poate fi dezactivat atunci cnd se consider c nu este
necesar.
Session tine informatia pe server, iar ViewState pe client. Sintaxa ViewState este identica
cu Session.
- Vertraulich / Confidential -

E si ViewState o solutie - dezavantajul - daca tine cantitati mari de date in ViewState, by


default ele vor fi transmise de la web server la absolut fiecare response, si spre web
server la fiecare submit (intr-un camp hidden), marind inutil dimensiunea paginii ...
8. Ce reprezinta Reflection?
Reflection este o tehnic de citire a dll-urilor managed, mai precis a assembly-urilor.
Aceast tehnic furnizeaz un mecanism de a descoperi tipurile i de a invoca
proprietile la
runtime.
9. Care este diferenta intre class si struct?
Deosebirea consta in accesul implicit la membri: private la class si public la struct.
De asemenea
class Derived : Base //...

este echivalent cu
class Derived : private Base //...

pe cand
struct Derived : Base //...

este echivalent cu
struct Derived : public Base //...

10. Ce este o tranzactie?


O tranzactie este o secventa de una sau mai multe instructiuni SQL care impreuna
formeaza o unitate de lucru. Se utilizeaza pe baze de date si reprezinta propagarea uneia
sau mai multor schimbari in db.
Se pune la inceputul unei interogari, in cazul in care una dintre operatii esueaza nu se va
efectua nici o modificare asupra bazei de date/tabelului
Se foloseste doar pentru insert,update si delete. Nu se pot folosi cand cream sau stergem
(drop) tabele pentru ca acestea se fac(comit) automat in baza de date
Comenzi folosite:
COMMIT-pentru a salva modificarile invocate de o tranzactie, marcheaza sfarsitul unor
operatii executate cu succes
ROLLBACK TRANSACTION-face rollback la toate modificarile de la inceputul tranzactiei
sau pana la savepoint,
TIPURI DE TRANZACTII
1.

Tranzactii automate sunt pornite si incheiate automat de catre server. Serverul initiaza
otranzactie in momentul inceperii unei instructiuni si in functie de succesul comenzii o incheie
sau o inverseaza

- Vertraulich / Confidential -

2.

Tranzactii implicite sunt tranzactii automate compatibile ANSI SQL-92. Sunt initializate
automat la executarea oricarei comenzi dar este necesara finalizarea explicit. Pentru a active
/dezactiva se utilizeaza comanda Transact-SQL IMPLICIT_TRANSACTIONS

3.

Tranzactii definite de utilizator sunt controlate de catre utilizator cand sa inceapa si cand se
termina

4.

Tranzactii distribuite folosesc mai multe servere,pot participa doar cele care suporta
specificatia X/Open XA pentru prelucrarea tranzactiilor distribuite.

Trebuie sa cuprinda toate interogarile facute oriunde in sistem


Decizia de rollback sau commit trebuie sa ia in considerare statusul tuturor interogarilor din
tranzactie sis a aiba acelasi effect pe ambele servere

11. Ce inseamna transmitere prin referitna si valoare?

-transferul prin valoare: Metoda copiaza valoarea parametrului efectiv in parametrul formal al
subrutinei. Modificarile aduse parametrului subrutinei nu vor modifica valoarea parametrului
efectiv.
-transferul prin referinta: Se transmite parametrului formal o referinta a parametrului efectiv si
nu valoarea acestuia. In interiorul subrutinei, referinta este utilizata pentru accesul la
parametrul efectiv. Asadar modificarile parametrului formal vor afecta si parametrul efectiv.
public static void Schimb(ref int i, ref int j)...
int x=10, y=20;
Schimb(ref x,ref y);
x=10 si y=20 inainte de apelul metodei Schimb
x=20 si y=10 dupa apelul metodei Schimb
Modificatorul de parametrii out: -se utilizeaza atunci cand se doreste intoarcerea de catre
metoda a mai multor valori mediului apelant. O instructiune return intoarece o singura
valoare. Daca se doreste intoarcerea spre exemplu a doua valori atunci problema se rezolva
cu ajutorul modificatorului out. -apare atat in declaratia cat si in apelul metodei; -intoarce o
valoare dintr-o metoda. Nu este necesar ca variabila utilizata ca parametru out sa fie
initializata inainte de apelul metodei. Metoda va da acesteia o valoare. Mai mult, in corpul
metodei, un parametru out este considerat ca neinitializat.
public int InfoDreptunghi_si_Arie(out
bool patrat)
{
if (l == L)
patrat = true;
else
patrat = false;
return l * L;
}
12. De cate tipuri sunt User Controalele in ASP.NET?
13. Ce reprezinta Session? Ce durata are un session?
- Vertraulich / Confidential -

O metod prin care utilizatorul se poate autentifica nainte de a-i fi permise anumite
operaii, respectiv adugarea i editarea. Acest mecanism se bazeaz pe noiumea de
Sesiune.
O sesiune permite serverului de web s asocieze un set de date cu un anumit tip de
browser. Prin aceasta, browserul ramne, hai s spunem agat n prima pagin pe care
o afieaz. Informaia utilizat pentru aceasta este unic i este utilizat ca i cheie de
validare pentru accesul la urmtoarele pagini.
Serverul de web aga browserul prin utilizarea unui cookie. Un cookie este o secven
de cod de dimensiune mic, trimis de server clientului la accesarea unei pagini de web i
care este citit de fiecare dat cnd pagina de web este renrcat. LA primul apel al
paginii de web, cookie-ul nu exist, astfel nct serverul de web va crea o nou sesiune i
va plasa ID-ul acelei sesiuni ntr-un cookie, pe care-l va trimite apoi browserului. n
principiu, se pote stoca diferite informaii ntr-un cookie, dar deoarece cu ct mai multa
informaie este stocat, cu att mai mult memorie este necesar la server, uzual
cookie+ul conine un numr minim de informaii.
Bazat pe acest mecanism, s ncercm s restricionm accesul n adugare i
editare. Informaia stocat n cookie este suficient s fie o simpl valoare boolean. Care
s precizeze co utilizatorul are sau nu acces la aceste pagini.
Orice sesiune este lansat la apelul primei pagini dintr-o cerere i ncepe prin
lansarea n execuie a unei funcii numite Session_Start(), localizat n Global.asax. S
adugm aceast funcie:
protected void Session_Start(Object sender, EventArgs e)
{
Session["permis"] = false;
}
Proprietatea Session permite adugarea de variabile, numite variabile de sesiune.
n funcie, noi am adugat o variabil numit permis, creia i-am atribuit valoarea false.
Deci, la ncrcarea paginii Default.aspx, aceast variabil va fi fcut implicit false.
14. Ce inseamna cuvantul cheie virtual?
The virtual keyword is used to modify a method, property, indexer, or event declaration
and allow for it to be overridden in a derived class. For example, this method can be
overridden by any class that inherits it:
public virtual double Area()
{
return x * y;
}
The implementation of a virtual member can be changed by an overriding member in a
derived class.
15. Care este diferenta intre clasa abstracta si interfata?

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.

- Vertraulich / Confidential -

- 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.
- Metoda abstracta (publicabstractintCalculateWage();
) poate fi implementata diferit in clasele derivate.
- O clasa poate mosteni o singura clasa abstracta.
- O clasa poate furniza atat membri abstracti cat si membri cu implementare concreta.

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

16. Ce este un Web Service? ( ca la 6)


17. Ce inseamna sealed?

Se foloseste in situatiile in care se doreste impiedicarea mostenirii.


//aceasta clasa
//nu va putea fi mostenita
sealedclassM
{

- Vertraulich / Confidential -

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.

18. Ce inseamna using?

Daca programul utilizatorului include referinte frecvente catre membrii unui spatiu de nume,
specificarea spatiului de nume ori de cate ori trebuie sa referiti un membru al sau devine
greoaie. Directiva using rezolva aceasta problema. Directiva using are doua forme: using
nume; si respectiv using alias=nume; Referitor la cea de-a doua forma, alias devine un alt
nume pentru clasa sau spatiul de nume specificat prin nume
19. Ce inseamana dispose?

Finalize si Dispose, in c#.


Ambele metode sunt executate cand un obiect este distrus. In mod normal Garbage
Collector (zis in continuare GC) elibereaza memoria curatand obiectele aflate acolo
sprea care nu exista nici o referinta. Cu alte cuvinte, daca avem asa:
Personp=newPerson("gigel");
p=null;

vine GC si curata ceea ce am instantiat in p, fara a necesita ca eu, programator, sa ma


preocup de curatenie
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:
publicclassPerson
{
publicPerson(){/* constructor code goes here */}
~Person(){/* destructor */}
}

ceea ce compilerul traduce in:


protectedoverridevoidFinalize()
- Vertraulich / Confidential -

{
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. Nu este legal sa fie executat la dorinta programatorului.
uitasem sa spun: GC vine cand vrea el, in .Net nu este controlabil momentul in care
GC va face munca de curatenie. E la fel ca programatorul care vine la munca intre 8 si
12, in functie de cat de mult a fumat cu o zi inainte.

20. Ce inseamna overriden?

Override se foloseste pentru a modifica o metoda sau o proprietate si furnizeaza o noua


implementare a unui membru mostenit dintr-o clasa de baza. Metoda de baza
suprascrisa si metoda de suprascriere trebuie sa aiba aceeasi signatura ( tip si numar de
parametri ).
Implicit, metodele nu sunt virtuale. Nu se pot suprascrie metodele care nu sunt
virtuale.
classBaza
{
publicvirtualvoidAfiseaza()
{
Console.WriteLine("Apelul functiei Afiseaza din clasa de baza\n");
}
}
classDerivata:Baza
{
publicoverridevoidAfiseaza()
{
Console.WriteLine("Apelul functiei Afiseaza din clasa derivata");
}
}
Derivataobiect2=newDerivata();
//instantiem pe un obiect din clasa derivata
Bazaobiect1=obiect2;
//afiseaza functia din clasa de Baza
- Vertraulich / Confidential -

obiect1.Afiseaza();
obiect2.Afiseaza();

Polimorfismul ajuta la reducerea complexitatii pentru ca permite unei interfete sa fie


folosita de fiecare data pentru specificarea unei clase generice de actiuni. Programatorul
nu va efectua manual selectia. Selectia actiunii specifice (metoda) va fi facuta de
compilator.
21. Care este obiectul de baza in C#? Care sunt metodele pe care le are acest obiect?

Despre .Net Framework putem spune ca reprezinta o biblioteca ce contine o multitudine


de clase pe care le putem folosi intr-o aplicatie dezvoltata in C#. Toate aceste clase
mostenesc Object.
Clasa Object reprezinta clasa de baza pentru toate tipurile din .Net. Fie ca sunt tipuri
valoare, referinta, predefinte sau create de utilizator, toate deriva din clasa Object.
- Equals
-GetType
-GetHashCode;
- ToString

22. Ce este un Mutex? Dar un Monitor?


Presupunem ca ne dorim ca aplicatia la care lucram sa ruleze intr-o singura instanta.
Pentru a nu permite utilizatorilor sa creeze mai mult de o instanta pentru aplicatie, vom
folosi clasa Mutex din namespace-ul System.Threading. Clasa Mutex permite accesul
exclusiv la o resursa partajata intre mai multe procese, pentru un singur thread. Acest
lucru diferentiaza obiectele Mutex fata de obiectele Monitor.
boolcreatedNew=false;
//numele unic al aplicatiei
Mutexmutex=newMutex(true,"SingleInstamce",outcreatedNew);
23. Ce inseamna apel prin valoare si apel prin referinta? ( identic 11)
24. Ce metoda trebuie suprascrisa pentru a crea un WebPart?
25. Cum pot elibera memorie?
Delete() sau chemi Garbagecollector

- Vertraulich / Confidential -

System.Gc
Pentru a programa cu Garbage Collector, in BCL se gaseste clasa Gc.
Cu ajutorul ei, putem forta inceperea garbage collection-ului.
GC.Collect();

Un moment in care se poate folosi este cel dupa alocarea unui numar foarte mare de
obiecte si se doreste repede eliberarea memoriei. Sau atunci cand se vrea ca
executarea codului curent sa nu fie intrerupta de un eventual garbage collection.
Mai multe detalii despre acesta clasa puteti gasi pe msdn.
Se recomanda ca programatorii sa interactioneze cat mai putin cu System.Gc.
Finalize () apel implicit
Toti programatorii .Net stiu ca System.Object, clasa de baza, detine o metoda virtuala,
Finalize.
Implementarea metodei Finalize se mai numeste finalizer. Un finalizer va elibera doar
resurse externe, continute de obiectul respectiv. Implementarile finalizer sunt apelate de
GC atunci cand obiectul nu mai este folosit (cand spre el nici un alt obiect nu mai are
referinta).
Pentru suprascrierea metodei Finalize nu se foloseste clasicul override.
protectedoverridevoidFinalize()
{
}

Pentru codul de mai sus, vom primi mesajul de eroare la compilare Do not override
object.Finalize. Instead, provide a destructor.
Procedura corecta consta in definirea unui destructor:
/// <summary>
/// destructor
/// </summary>
~Persoana()
{
//cod pentru eliberarea resurselor din memorie
}

In cazul unui struct este incorect sa suprascriem Finalize pentru ca o structura este de
tip valoare, iar tipurile valoare nu sunt alocate in heap si nu vor fi luate in considerare
de garbage collecter.
Apelul pentru metoda Finalize va avea loc in momentul in care GC se apeleaza sau
atunci cand se forteaza apelarea lui.
Majoritatea claselor pe care un programator le defineste nu vor avea nevoie de o
eliberare explicita pentru ca vor fi colectate de GC.

- Vertraulich / Confidential -

Rolul metodei Finalize este sa se asigure ca un obiect poate elibera


resurseleunmanaged atunci cand este colectat de GC. Cu exceptia acestui caz, nu
este indicat ca tipul definit de noi sa suporte Finalize pentru simplu motiv ca procesul
de garbage collection va necesita mai mult timp. CLR determina automat daca un
obiect suporta metoda Finalize la alocarea lui in memoria heap. Daca da, obiectul este
marcat cafinalizable si un pointer catre acest obiect va fi adaugat intr-o
coada finalization queue. Aceasta contine toate obiectele ce trebuie finalizate inainte
de scoaterea lor dinmemoria heap. Cand GC intervine, el va examina fiecare
inregistrare din finalization queue si va copia obiectul de pe heap intr-o alta structura
managed, numitafinalization reachable table. In acest moment, pe un alt thread va
fi invocata metodaFinalize pentru fiecare obiect din finalization reachable table.
Datorita faptului ca programatorul nu poate stabili momentul cand GC apeleazaFinalize,
folosirea destructorilor trebuie sa fie ca un mecanism de back-up pentru eliberarea
resursele unmanaged. Modul recomandat este cel pe care il vom analiza in sectiunea
urmatoare, implementarea interfetei IDisposable.
IDisposable apel explicit
O alternativa, o sa vedeti ca e mai mai mult o completare, la suprascrierea
metodeiFinalize este implementarea interfetei IDisposable si apelarea singurei metode
definite in aceasta interfata, Dispose.
/// <summary>
/// definitia pentru clasa Persoana care implementeaza interfata IDisposable
/// </summary>
publicclassPersoana:IDisposable
{
publicstringNume{get;set;}
publicstringPrenume{get;set;}
publicoverridestringToString()
{
returnstring.Format("{0} {1}",Nume,Prenume);
}

publicPersoana(stringnume,stringprenume)
{
Nume=nume;
Prenume=prenume;
}
publicintCalculeazaVarsta()
{
return25;
}
publicvoidDispose()
{
//cod pentru eliberarea resurselor
Console.WriteLine("Disposed");
- Vertraulich / Confidential -

}
}

Spre deosebire de Finalize, care putea fi folosita doar pentru clase, IDisposable poate fi
utilizata si pentru structuri.
Daca un obiect suporta IDisposable, atunci se recomanda apelarea metodei Dispose.
Este o practica des intalnita ca atunci cand folosim obiecte managed care
implementeaza IDisposable , sa tratam posibilele exceptii.

try
{
p.CalculeazaVarsta();
}
finally
{
p.Dispose();
}

Pentru a scapa de acest ambalare intr-o constructie try/finally se poate folosi using.
using(Persoanap=newPersoana("Nume","Persoana"))
{
p.CalculeazaVarsta();
}

Exista un articol pe msdn, Implementing Finalize and Dispose to Clean Up


Unmanaged Resources in care se prezinta un pattern, un model, pentru
implementarea IDisposablesi Finalize intr-un mod performant.
Pe scurt, modul cum functioneaza GC:

cauta obiectele mangaged care au referinta in cod.

incearca sa finalizeze obiectele care nu mai au referinta in cod.

elibereaza obiectele care nu mai au referinta in cod si recupereaza


memoria alocata acestora.

Principalul motiv pentru interactiunea cu GC il reprezinta crearea unor clase care vor
opera asupra resurselor interne, unmanaged.
Daca veti cauta pe internet despre GC, veti observa ca este una din cele mai
controversate tehnologii din .Net.
A programa intr-un mediu cu garbage collected simplifica mult modul de dezvoltare.
De exemplu, in C++, programatorii trebuie sa stearga manual obiectele alocate,
iarmemory leak-urile trebuie detectate. Pasand permisiunea garbage collector-ului
sa distruga obiectele, de managementul memoriei nu se mai ocupa programatorul, ci
CLR.
26. Ce caracterizeaza o exceptie? Unde se arunca exceptia?
- Vertraulich / Confidential -

O exceptie reprezinta o eroare care intervine la runtime, la momentul executiei. In C#,


exceptiile se pot trata intr-o maniera structurata si controlata, acest lucru insemanand
faptul ca programatorul nu trebuie sa mai verifice manual daca o operatie se executa sau
nu cu succes.
C# defineste exceptii standard pentru tipurile de erori obisnuite dintr-un program. De
exemplu: impartire la zero, depasirea capacitatii unui vector, memorie insuficienta, etc.
Blocurile Try Catch Finally
Cuvintele cheie in C# rezervate pentru tratarea exceptiilor
sunt try, catch, finally, throw. Acestea reprezinta un sistem unitar, utilizarea unuia
dintre ele implicand si utilizarea altuia.
Intr-un bloc try vom scrie instructiunile care trebuie verificate pentru aparitia erorilor.
Daca pe parcursul executiei acestor intructiuni apare o exceptie, aceasta este
aruncata, lansata (thrown).
Cu ajutorul lui catch programul poate intercepta exceptia si o poate trata in functie de
logica programului. Instructiunile din catch se executa doar daca se lanseaza o
exceptie.
Instructiunile din finally se vor executa intotdeauna.
O imagine de ansamblu a codului folosit pentru tratarea exceptiilor:
try
{
//in this block exception may get thrown
}
catch
{
//handle exception
}
finally
{
//cleanup code, optionally
}

Cuvantul cheie try nu poate aparea fara a fi completat de cuvantul cheie catch sau
definally si nici invers. Finally este optional.

- Vertraulich / Confidential -

Un exemplu simplu de tratare a exceptiei DivideByZeroException si de folosire a


blocului try catch finally:
try
{
intx=0;
//raise the exception
inty=4/x;
}
catch
{
//catch the exception
Console.WriteLine("X must be greater than zero");
}
finally
{
//this code will be allways executed
Console.WriteLine("Program completed");
Console.Read();
}

Pot exista mai multe instructiuni catch asociate unui try. Instructiunea care se va
executa se va stabili in functie de tipul exceptiei, celelalte sunt ignorate.
staticvoidCompute(int[]numbers)
{
try
{
intsecondNumber=numbers[0];
Console.Write(secondNumber);
}
catch(IndexOutOfRangeException)
{
Console.WriteLine("Must provide more than an argument");
}
catch(NullReferenceException)
{
Console.WriteLine("Argument is null");
}
catch(FormatException)
{
Console.WriteLine("Argument is not a number");
}
catch(Exception)
{
Console.WriteLine("Another exception occured");
}
}

Se adauga instructiunile pentru blocurile catch cat mai specifice, inainte celor generale.
- Vertraulich / Confidential -

CLR cauta instructiunea catch care va trata exceptia. Daca metoda curenta in care ne
aflam cu debug-erul nu contine un bloc catch, atunci CLR va cauta in metoda care a
apelat metoda curenta, si asa mai departe conform call stack. Daca nu este gasit nici
un catch, atunci CLR va afisa un mesaj cum ca exceptia nu este tratata, unhandled
exception message, apoi va opri executia programului.
In general, instructiunea catch nu are un parametru. Totusi, il putem adauga in cazul in
care vom avea nevoie de accesul la obiectul care reprezinta exceptia. Este folositor
pentru furnizarea informatiilor suplimentare despre eroarea produsa.
catch(Exceptionexception)
{
Console.WriteLine(exception.Message);
Console.WriteLine(exception.GetType());
}

Fluxul executiei programului continua cu instructiunile aflate dupa blocul catch.


Throw
Pentru a lansa manual o exceptie se foloseste throw.
if(numbers==null)
thrownewArgumentNullException("Array is null");

Tipul obiectului trebuie sa fie o clasa derivata din Exception.


Exemplu de folosire a blocului finally
Instructiunile dintr-un bloc finally se executa intotdeauna, chiar daca o exceptie este
prinsa sau nu. Acest bloc este folosit pentru a curata resursele folosite intr-un bloc trysi
pentru a asigura executarea unor instructiuni de cod indiferent de modul in care se iese
din blocul precedent de try.
staticvoidReadFile()
{
StreamReaderreader=null;
try
{
//open text file for reading
reader=File.OpenText(@"C:\fisier.txt");
//return if the current position is at the end of the stream
if(reader.EndOfStream)return;
//read the content of the stream
Console.WriteLine(reader.ReadToEnd());
}
- Vertraulich / Confidential -

catch(FileNotFoundException)
{
Console.WriteLine("File not found");
}
finally
{
//cleanup code, close the file
if(reader!=null)
reader.Dispose();
}
}

Relansarea unei exceptii


Presupunem urmatoarea clasa. In metoda Divide vom trimite
exceptiaDivideByZeroException la un nivel mai sus, in metoda parinte.
classCompute
{
publicvoidDivideTwoNumbers(intx,inty)
{
try
{
varresult=x/y;
}
catch(DivideByZeroException)
{
// the control goes back to parent method
throw;
}
}
}

In metoda Main :
staticvoidMain(string[]args)
{
Computecomp=newCompute();
try
{
comp.DivideTwoNumbers(5,13);
}
catch(DivideByZeroException)
{
Console.WriteLine("Exception caught here");
}
}

System.Exception
- Vertraulich / Confidential -

Dupa cum s-a putut observa in exemplele de mai sus, exceptiile sunt reprezentate prin
clase. Toate deriva din clasa de baza Exception. Se disting doua clase prin
reprezentarea a doua categorii generale de exceptii: exceptii generate de motorul de
executie SystemException si exceptii generate de programele de
aplicatieApplicationException. Ele nu adauga membri noi la clasa de baza, ci doar
definesc radacile celor doua ierarhii de clase care reprezinta exceptii. De exemplu, in
cazul impartirii la zero se produce o exceptie de tipul DivideByZeroException.
Programatorul isi poate defini propriile clase care reprezinta exceptii prin derivarea
clasei ApplicationException.
Pentru mai multe detalii, se poate consulta documentatia de pe msdn.
Un program trebuie sa trateze exceptiile intr-o maniera logica si eleganta si sa isi
continue apoi executia. Daca programul nu intercepteaza exceptia, el va fi fortat sa se
inchida.
Chiar daca nu este considerata optima, o alta modalitate de raportare a erorilor o
reprezinta codurile de retur. Ce parere aveti? Voi ati utilizat-o?
Pentru ca tratarea erorilor constituie un subiect dificil voi continua intr-un viitor articol
crearea propriilor clase de exceptii si consecintele exceptiilor neinterceptate.

27. Ce reprezinta mostenirea multipla?


28. De cate tipuri de securitate sunt in ASP.NET?
29. Ce reprezinta arhitectura N-TIER?

Arhitectura n straturi este o structur de cerere care sunt separate de lucru


pentru servere (prestatorii de servicii) i clienii (serviciu requesters) pentru a
uura dezvoltatorii n dezvoltarea de aplicaii web. Structura include un
numr de nivelurile aranjate unul pe altul i fiecare nivel este alocat pentru
set distincte de activitate. De asemenea, cunoscut ca multi arhitectura,
aceast arhitectur client-server include seciuni separate pentru
prezentarea, procesarea cererii i proceselor de gestionare a datelor.
Acesta este adesea vazut c att clieni i servere se supun comunicarea
printr-o reea de calculator comune, dar utiliznd hardware separat. Sistemul
de calcul al furnizorilor de servicii (server) gzdui un numr de programe s
fie partajate cu clientii. Dimpotriv, un client nu poate partaja oricare dintre
resursele sale personale cu masina de server i n schimb, pot trimite
solicitare primit pentru serviciile de pe server. Aici se afl utilizarea N-tier
arhitectura client-server, care stabilete un model pentru dezvoltatori web
pentru a crea aplicatii web personalizate ca pe cerinele specifice de afaceri.
- Vertraulich / Confidential -

Un beneficiu major al folosind N-tier arhitectura este c dezvoltatorii web pot


separa uor aplicaii n mai multe niveluri i pot modifica-le mai degrab
dect rescrierea ntreaga aplicaie. n plus, cererile sunt vag conectat cu
fiecare alte i modificrile fcute ntr-o aplicaie mpiedic performan
altora.
n general, dezvoltatorii de aplicaii web utilizai aplicarea 3-tier, care include
un nivel de programare, un nivel de logica i un nivel de date. Nivelul de
programare interfa utilizator traduce sarcina pentru a ajuta utilizatorul
nelege cu uurin informaii legate de servicii. Acest nivel superior a
structurii cererii interacioneaz cu alte niveluri prin furnizarea de rezultate
pentru toate celelalte niveluri n reeaua de calcul. Nivelul de logica
controleaz funcionarea aplicaiei de procesare comenzi, evaluare i calcul
datele specifice. Informaii de programare strat ulterior este stocat n
servere de baze de date de nivelul de date. Informaiile stocate este apoi
transferate napoi la nivelul de logica pentru o prelucrare ulterioar i n cele
din urm la sistemul de calculator utilizatorii.
30. Ce reprezinta supraincarcarea operatorilor?
Suprancrcarea operatorilor
Suprancrcarea operatorilor n C# se face numai prin metode statice membre n clase.
Exist trei forme de suprancrcare:
Operatori de conversie explicii (conversia trebuie fcut implicit printr-un
cast) sau implicii (conversia poate fi fcut automat de ctre compilator):
public static implicit operator tip_returnat (NumeClasa param);
sau
public static explicit operator tip_returnat (NumeClasa param);
Operatori unari pentru suprancrcarea operatorilor +, -, ~, !, ++ i --:
public static tip_returnat operator operatorul (NumeClasa param);
Operatori binari pentru suprancrcarea operatorilor +, -, *, /, %, &, |, ^, <<,
>>, ==, !=, >, <, >= i <=:
public static tip_returnat operator operatorul (NumeClasa param, tip operand2);
Se observ c nu poate fi suprancrcat operatorul de atribuire. Unii operatori trebuie
suprancrcai numai n pereche (== i !=, < i >, <= i >=). n cazul n care se
suprancarc unul din operatorii binari +, -, /, *, |, &, ^, >>, <<, compilatorul va
genera automat i suprancrcri pentru operatorii derivai +=, -=, /=, *=, |=, &=, ^=,
>>=, <<=.
Exemplu de suprancrcri pentru clasa ListaPersoane:
// operator de conversie explicita la int
// utilizare: int nr = (int)lista;
public static explicit operator int(ListaPersoane lista)
{
return lista.NumarPersoane;
}
// supraincarcarea operatorului + pentru concatenarea a doua liste
- Vertraulich / Confidential -

// utilizare:
// a) lista = lista1 + lista2;
// b) lista += lista1;
public static ListaPersoane operator +(ListaPersoane lista1, ListaPersoane lista2)
{
// alocare memorie
Persoana[] lista = new Persoana[lista1.NumarPersoane + lista2.NumarPersoane];
// copiere elemente
for (int i = 0; i < lista1.NumarPersoane; i++)
lista[i] = new Persoana(lista1[i].Nume, lista1[i].Varsta);
for (int i = 0; i < lista2.NumarPersoane; i++)
lista[i + lista1.NumarPersoane] = new Persoana(lista2[i].Nume, lista2[i].Varsta);
// returnare rezultat
return new ListaPersoane(lista);
}
31. Ce inseamna delegat?

In programare, exista situatii cand trebuie sa executam o anumita actiune, dar fara sa
stim in avans ce metoda sau ce obiect vom apela pentru executarea actiunii. Exemplu :
la apasare, un buton va sti ca trebuie sa notifice un anumit obiect , dar nu stie exact
care. Solutia simpla consta in conectarea butonului la un delegat si apoi acesta sa indice
catre o anumita metoda.
Un delegat este un obiect care poate referi o metoda. Chiar daca nu este un obiect, o
metoda ocupa un loc in memorie, iar aici, la aceasta adresa, va fi transmis controlul la
invocarea metodei.
Un delegat reprezinta modul prin care se realizeaza comunicarea intre obiecte. Un
delegat este un tip referinta si este este echivalentul unui pointer la functie din C++.
Diferenta este ca delegates sunt type-safe si ca sunt orientati pe obiect.
Un delegat se declara cu ajutorul cuvantului delegate.
delegate tip-rez nume (lista-parametri);
tip-rez tipul valorii intoarse de metodele pe care delegatul le va apela.
nume numele delegatului.
lista-parametri lista de parametri necesari metodelor care vor fi apelate prin
intermediul delegatului.

- Vertraulich / Confidential -

Poate fi declarat in afara unei clase, sau in interior. In functie de cum se vrea
vizibilitatea lui, ii putem aplica modificatorii de acces public, private, protected,etc.
Dupa ce a fost declarat, un delegat poate apela doar metode cu acelasi tip returnat si
aceeasi lista de parametri.
Exemplu :
//declararea unui delegat
delegateintStringLengthDelegate(stringstr);
delegatestringStringReverseDelegate(stringstr);

Intr-o clasa, construim functiile care vor fi apelate prin delegate.


classDelegateTest
{
//returneaza numarul de caractere al unui sir de caractere
publicintStringLength(stringstr)
{
Console.WriteLine("Va returna numarul de caractere");
returnstr.Length;
}
//returneaza sirul inversat
publicstringStringReverse(stringstr)
{
stringtemp="";
inti;
Console.WriteLine("Inverseaza sirul.");
//parcurgem sirul invers si concatenam
for(i=str.Length1;i>=0;i)
temp+=str[i];
returntemp;
}
}

In metoda Main :
DelegateTesttest=newDelegateTest();
//construim delegat
StringLengthDelegatestrLength=new
StringLengthDelegate(test.StringLength);
//sirul care va fi transmis functiilor
stringstr;
//apelul unei metode prin intermediul delegarii convertim de la numar la string
//pentru ca functia returneaza int
str=strLength("Test").ToString();
Console.WriteLine(str);
//construim delegat
StringReverseDelegatestrReverse=new
StringReverseDelegate(test.StringReverse);
//apelul unei metode prin intermediul delegarii
- Vertraulich / Confidential -

str=strReverse("Test");
Console.WriteLine(str);

Pe scurt: avem doua metode statice in clasa DelegateTest ale caror signaturi coincid cu
signaturile delegatilor. In Main, construim referinte de
tipul StringLengthDelegate siStringReverseDelegate, pe care le atribuim metodelor.
Se mai observa ca invocarea delegatilor determina apelul metodelor.Determinarea
metodei apelate se rezolva la momentul executiei, nu la compilare.

32. Ce inseamna delegat multicast?

Multicasting
Multicasting-ul se defineste ca o facilitate a delegatilor si consta in capacitatea de a
crea un lant de metode care vor fi automat apelate la invocarea unui delegat. Delegarile
multicast trebuie sa returneze un rezultat de tip void, iar pentru crearea lor se folosesc
operatorii += si =, dupa instantierea unui delegat.
Exemplu :
//declararea unui delegat multicast
delegatevoidMulticastDelegat(stringstr);
//construim delegatii
MulticastDelegatmultiDel;
MulticastDelegateStringLength=new
MulticastDelegat(test.StringLength);
MulticastDelegatStringReverse=new
MulticastDelegat(test.StringReverse);
multiDel=StringLength;
//crearea unui delegat multicast
multiDel+=StringReverse;

Datorita faptului ca la compilare, nu se cunosc metodele care urmeaza a fi executate,


lucrul cu delegate este intalnit in arhitecturile care permit adaugarea componentelor pe
parcurs.

33. Ce inseamna o functie asincrona?


34. ce Inseamna cuvantul cheie static?
35. Ce este un constructor static?
A static constructor is used to initialize any static data, or to perform a particular action
that needs to be performed once only. It is called automatically before the first instance is
created or any static members are referenced.
- Vertraulich / Confidential -

class SimpleClass
{
// Static variable that must be initialized at run time.
static readonly long baseline;
// Static constructor is called at most one time, before any
// instance constructor is invoked or member is accessed.
static SimpleClass()
{
baseline = DateTime.Now.Ticks;
}
}
Static constructors have the following properties:
A static constructor does not take access modifiers or have parameters.
A static constructor is called automatically to initialize the class before the first
instance is created or any static members are referenced.
A static constructor cannot be called directly.
The user has no control on when the static constructor is executed in the program.
A typical use of static constructors is when the class is using a log file and the
constructor is used to write entries to this file.
Static constructors are also useful when creating wrapper classes for unmanaged
code, when the constructor can call the LoadLibrary method.
If a static constructor throws an exception, the runtime will not invoke it a second
time, and the type will remain uninitialized for the lifetime of the application
domain in which your program is running.
36. Ce inseamana cuvantul cheie ref? Dar out? ( see 11)
37. Care e diferenta dintre (string) obj si obj as string?
explicit cast : (string) obj
string s = (string)o;

Throws InvalidCastException if o is not a string. Otherwise, assigns o to s, even


if o is null
string s = o as string;

Assigns null to s if o is not a string or if o is null. For this reason, you cannot use it with
value types (the operator could never return null in that case). Otherwise, assigns o to s.
As is a cast. With it, we gain performance and avoid exceptions when a cast is invalid.
Null is returned when the cast is impossible. For reference types, the as-cast is
recommended. It is both fast and safe.
Tip:
We can test the resulting variable against null and then use it. This eliminates extra
casts.
38. Ce reprezinta un atribut?
39. Ce moduri de pastrare a starilor pentru ASP.NET?
40. ce contine manifestul unui assembly?

- Vertraulich / Confidential -

un assembly mai conine i o seciune numit Manifest care conine metadate ce descriu
setul de fiiere dintr-un assembly. Din punct de vedere fizic, un assembly se poate identifica
printr-un fiier dll sau exe. Un alt concept cu care opereaz o aplicaie din punct de vedere
structural este domeniul aplicaiei (AppDomain). Domeniul aplicaiei conine assembly-urile
cu care opereaz o aplicaie
41. ce reprezinta GAC?
Global Assembly Cache

With the GAC, you can share assemblies across many applications. The GAC is
automatically installed with the .NET runtime.
42. Ce reprezinta un indexer?
Indexers allow instances of a class or struct to be indexed just like arrays. Indexers
resemble properties except that their accessors take parameters.
In the following example, a generic class is defined and provided with
simple get and set accessor methods as a means of assigning and retrieving values.
The Program class creates an instance of this class for storing strings.
C#
class SampleCollection<T>
{
// Declare an array to store the data elements.
private T[] arr = new T[100];
// Define the indexer, which will allow client code
// to use [] notation on the class instance itself.
// (See line 2 of code in Main below.)
public T this[int i]
{
get
{
// This indexer is very simple, and just returns or sets
// the corresponding element from the internal array.
return arr[i];
}
set
{
arr[i] = value;
}
}
}
// This class shows how client code uses the indexer.
class Program
{
static void Main(string[] args)
{
// Declare an instance of the SampleCollection type.
SampleCollection<string> stringCollection = new
SampleCollection<string>();
// Use [] notation on the type.
stringCollection[0] = "Hello, World";
- Vertraulich / Confidential -

System.Console.WriteLine(stringCollection[0]);
}
}
// Output:
// Hello, World.
43. Cum se poate porni un proces?

Sistemele de operare moderne suporta multitasking (capacitatea de a incarca


mai multe programe in memorie simultan si sa imparta timpul CPU intre programe). De
exemplu, momentul cand in sistemul de operare Windows am deschis mai multe
programe (Winamp, Internet Explorer, Messenger).
Sistemele de operare moderne suporta multithreading. (capacitatea de a
suporta mai multe unitati de executie intr-un singur proces, fiecare thread(fir de executie)
avand bucati din timpul CPU).
Am ales sa scriu un articol despre threading pentru ca orice aplicatie, cat de cat
serioasa, nu poate rula pe un singur thread (nevoia de a rula alte operatii in acelasi timp
in background este mare). Problema intervine atunci cand este nevoie ca ele sa imparta
aceleasi resurse.
.Net Compact Framework suporta Threading prin doua moduri:
1.

obiectul Thread (spawn, inchidere, transmitere de mesaje intre threaduri)

2.

Timer

System.Threading.Thread incapsuleaza toata functionalitea oferita de thread in


Windows Mobile din Compact Framework.
Vom crea o mini-aplicatie multithread care va rula un proces in background, dar care
va permite utilizatorului sa interactioneze in continuare prin controale.
Cand e bine sa pornim un thread?
Daca programul e pe cale sa angreneze un proces despre care se stie ca va dura si
pentru ca utilizatorul sa nu astepte, atunci este bine sa pornim thread-ul care va lucra la
procesare, lasand thread-ul principal al UI sa ruleze.
De exemplu, in aplicatia noastra pe care o vom dezvolta, vom avea o metoda care va
realiza un calcul ce va necesita un timp mai mare de executie.
Adaugam spatiul de nume necesar:
usingSystem.Threading;

- Vertraulich / Confidential -

Pentru a crea si a porni un thread in .Net Compact Framework, trebuie sa urmam


pasii:
1.

Cream o instanta a System.Threading.ThreadStart. Transmitem ca


parametru numele metodei care va fi executat in thread, metoda care
trebuie sa fie de tip void si sa nu accepte parametri

2.

3.

//PAS1 instanta ThreadStart


ThreadStartfirstThreadStarg=newThreadStart(Count);

Cream o instanta a System.Threading.Thread.


Transmitem ThreadStart in constructorul Thread si astfel vom avea o
referinta catre thread-ul care va executa metoda specificata in Pasul 1.

4.

5.

//PAS2 instanta THREAD


ThreadfirsThread=newThread(firstThreadStart);

Apelam metoda Start(), astfel codul din metoda referinta va fi executat


in cadrul thread-ului respectiv. Acesta nu va porni pana la apelul
metodei Start.

6.

//PAS3 start thread


firsThread.Start();

Metoda Count:
privatevoidCount()
{
for(inti=0;i<100000;i++)
{
result=+i;
//EXCEPTIE
this.lblInfo.Text=result.ToString();
}
}

In .Net Compact Framework, controale nu pot fi folosite de firele de executie care nu


detin propriu-zis controlul( nu putem porni un fir de executie si apoi sa actualizam
elemente din interfata utilizator din acel tread prin interactionarea directa cu controale.
Daca vom face acest lucru, vom primi exceptia:

- Vertraulich / Confidential -

In .Net Framework exista Form.BeginInvoke si Form.EndInvoke, metode care nu


sunt In .Net Compact Framework. Solutia consta in crearea unui delegate pentru o
metoda care va face schimbarile in interfata utilizator. Apoi, folosim Form.Invoke pentru
apelul delegatului din thread.
privatevoidCount()
{
for(inti=0;i<100000;i++)
{
result=+i;
this.Invoke(newEventHandler(UpdateControl));
}
}
privatevoidUpdateControl(objectsender,EventArgse)
{
lblInfo.Text=result.ToString();
}

Inchiderea unei aplicatii multithreading


O aplicatie nu este considerata oprita pana cand toate firele de executie sunt oprite.
Daca un thread se afla intr-un ciclu si aplicatia se inchide, el poate face ca procesul sa
nu se termine.
O solutie este sa suprascriem metoda Form.OnClosing(). Astfel, fiecare thread
poate sa determine daca aplicatia incearca sa se inchida. In cazul in care acesta
determina ca este ultimul fir, aplicatia se poate inchide.
Suspendarea unui thread
Pentru a suspenda executia unui thread, se foloseste metoda Thread.Sleep(), in
acest mod blocandu-se intreg codul executat la apelarea thread-ului. Ca parametru va
primi un numar de milisecunde, timp in care thread-ul va dormi inainte sa fie asezat in
coada de asteptare a procesorului.
// va suspenda codul din thread-ul curent
// 10000 millisecunde
Thread.Sleep(10000);

- Vertraulich / Confidential -

Stim ca o instanta a clasei Timer este foarte utila atunci cand vrem sa executam cod
la anumite intervale. Clasa Timer este alegerea perfecta atunci cand avem nevoie sa
executam operatii la intervale regulate de timp, dar operatii nu de mare complexitate.
Avantajele clasei Timer asupra clasei Thread in folosirea firelor de executie sunt
controlul usor al executarii codului la un anumit interval, sleep implicit atunci cand nu
se executa codul plus faptul ca in interfata utilizator controalele pot fi accesate de codul
executat de clasa Timer.
In Compact Framework, exista limitari in ceea ce priveste notiunuea de Threading:
1.

numarul maxim de procese este 32.

2.

fiecare process primeste maxim memorie 32 MB.

3.

cu toate ca thread-urile sunt mai putin costisitoare, crearea prea multor


fire de executie poate afecta performanta.

Suportul pentru Threading in .Net Compact Framewokr permite dezvoltarea unor


aplicatii smart-device mult mai sofisticate prin mutarea in background a proceselor care
necesita mai mult timp pentru procesare. Aceasta decizie necesita o intelegere foarte
buna a implicatiilor si a optiunilor existente la acel moment. Daca este folosita corect,
procesarea in background imbunatateste timpul de raspuns al aplicatiei si furnizeaza o
experienta superioara pentru utilizator.

44. Ce reprezinta un timer?

Timers - permit executia unei anumite metode la intervale regulate de timp.


.NET Framework furnizeaza 4 (patru) timers.
Doi dintre acestia sunt folositi in multithreading:
- System.Threading.Timer
- System.Timers.Timer
iar
- System.Windows.Forms.Timer (Windows Forms timer)
- System.Windows.Threading.DispatcherTimer (WPF timer)
sunt folositi in single threading.
45. Cum se poate tipari o imagine direct din cod in ASP.NET pe o pagina web?
46. Ce reprezinta serializarea?

Salvarea datelor ntr-un fiier binar se face prin serializare. Serializarea este o metod ce
permite transformarea unui obiect ntr-o secven de octei din care s poat fi refcut
ulterior obiectul original. Serializarea permite unui obiect s fie convertit ntr-un flux de date,
care apoi este salvat ntr-un fiier binar.
Operaia de serializare presupune parcurgerea etapelor:

- Vertraulich / Confidential -

declararea unei clase ca fiind serializabil, prin adugarea naintea definiiei clasei a
atributului [Serializable]
adugarea bibliotecilor corespunztoare: using System.IO; using
System.Runtime.Serialization. Formatters.Binary;
instanierea unui obiect din clasa FileStream: FileStream fileStream = new
FileStream("stud.dat", FileMode.Create, FileAccess.Write);
instanierea unui obiect din clasa BinaryFormatter: BinaryFormatter bf = new
BinaryFormatter();
apelul metodei Serialize() din clasa BinaryFormatter: bf.Serialize(fileStream, lista);
nchiderea stream-ului: fileStream.Close();
Procesul invers de citire a unui obiect serializat pentru a-i reface starea original se numete
deserializare. Operaia de deserializare presupune parcurgerea etapelor:
instanierea unui obiect din clasa FileStream: FileStream fileStream = new
FileStream("stud.dat", FileMode.Open, FileAccess.Read);
Citirea dintr-un fiier XML se poate face utiliznd metoda Read() din clasa abstract
XmlReader din namespace-ul System.Xml. Paii pentru citire i parsare fiier XML:
instanierea unui obiect din clasa StreamReader: StreamReader sr = new
StreamReader("nbrfxrates.xml");
citirea coninutului fiierului: string str = sr.ReadToEnd();
obinerea unui obiect din clasa XmlReader prin apelul metodei Create(): XmlReader reader
= XmlReader.Create(new StringReader(str));
prelucrarea obiectului din clasa XmlReader: while (reader.Read()) {...}
47. Cum creez o clasa serilizabila? Exemplu de clasa neserializabila!
Pn acum am vzut cum se pot salva i restaura n i din fiiere datele de tip
octet sau caracter. Dar ce e de fcut, dac avem de salvat i restaurat date mai
complexe, de exemplu obiecte ale unei clase? Evident, obiectele se pot salva sub
form de iruri de octei, dar va fi foarte greu la restaurare s mprim octeii astfel
nct s recompunem obiectele salvate. Din fericire, majoritatea limbajelor de nivel
nalt, inclusiv C#, implementeaz un mecnism simplu i fiabil ne salvare i restaurare
a obiectelor prin intermediul fiierelor. Acest mecanism poart denumirea de
serializare.
Orice clas ale crei obiecte pot fi salvate sau restaurate prin intermediul
fiierelor, va trebui fie s fie declarat serializabil, fie s implementeze o interfa
specific, numit ISerializable. n momentul n care infrastructura primete o cerere
de serializare a unor obiecte, va verifica nti dac clasa din care fac parte obiectele
implementeaz interfaa ISerializable i dac nu, va verifica dac a fost declarat ca
fiind serializabil. Dac nici una din condiii nu este ndeplinit, obiectele nu vor
putea fi serializate.
namespace unu_unu
{
[Serializable]
class Rezervare
{
- Vertraulich / Confidential -

public
{
}
public
public
public
public
}
}

Rezervare()
String Nume;
DateTime DataS;
DateTime DataP;
int nrCam;

48. Ce inseamana Enumerator?

.Net Framework contine doua seturi de interfete standard pentru enumerarea si


compararea colectiilor. Un set nontype-safe, IEnumerable si IEnumerator si un set
type-safe, IEnumerable <T> si IEnumerator <T>. Toate intefetele din .Net
Framework, prin conventie, isi incep numele cu I.
Interfata IEnumerable contine o singura metoda, GetEnumerator. Obiectul returnat
de aceasta metoda, este un enumerator folosit pentru parcurgerea elementelor colectiei,
el implementand interfata IEnumerator.
In general, cand se implementeaza interfata IEnumerable, se implementeaza si
interfata asociata IEnumerator.
Interfata IEnumerator
Obiectul enumerator este folosit pentru parcurgerea elementelor din colectie (il putem
privi ca un indicator care arata catre elementele dintr-o lista).
Interfata Ienumerator are proprietatea:
object Current {get;}
si metodele :
bool MoveNext() va directiona indicatorul catre urmatorul element din lista. Va
returnatrue, daca mai exista in colectie un alt element, false, daca nu.
void Reset() va returna indicatorul inapoi la primul element din lista.
Prin construirea unui enumerator, cu ajutorul metodei GetEnumerator a unei colectii,
si prin apelarea repetata a metodei MoveNext si preluarea valorii din
proprietateaCurrentfolosind un enumerator, putem naviga prin elementele unei colectii
din element in element. Daca vrem sa construim o colectie de clasa enumerabila, trebuie
- Vertraulich / Confidential -

sa implementam interfata IEnumerable in colectia de clase si sa furnizam


implementarea interfetei IEnumerator care sa fie returnata de
metoda GetEnumerator a colectiei de clase.
Se observa ca proprietatea Current nu are un comportament type-safe, ea returnand
un object. Framework-ul .Net pune la dispozitie interfata generica IEnumerator<T>, a
carei proprietate va returna un obiect de tip T. La fel si in cazul
interfeteiIEnumerable<T>, a carei metoda GetEnumerator va returna
un Enumerator<T>. Exista totusi diferente, intre cele doua. Una ar fi ca,
interfata IEnumerator<T> nu contine metoda Reset, extinzand, insa, mai mult,
interfata IDisposable.
In exemplul urmator, vom folosi interfetele IEnumerable si IEnumerator pentru a
folosi un foreach pentru obiecte ale clasei Cont, la fel cum il folosim pentru tipurile de
baza.
Construim clasa Cont care va contine 3 variabile membru, numarul unic al contului,
numele persoanei care detine contul si soldul contului si vom creea constructorul clasei
(articolul despre introducere in programarea pe obiecte). Mai adaugam si
functiatoString, pe care o vom suprascrie pentru a afisa in consola pentru fiecare obiect
al clasei, toti cei trei membri (articolul despre polimorfism).
//variabile membru
privateintnumarCurent;
privatestringnumeTitular;
privatedoublesold;
//constructor
publicCont(intnumarCurent,stringnumeTitular,doublesold)
{
this.numarCurent=numarCurent;
this.numeTitular=numeTitular;
this.sold=sold;
}
//suprascriem functia
//pentru a afisa toate variabilele membru
publicoverridestringToString()
{
return"Nr.Crt.:"+this.numarCurent.ToString()+"\nNume:"+
numeTitular+"\nSold:"+sold.ToString();
}

Vom construi clasa Conturi, care va contine un vector de obiecte Cont. Clasa va
contine si o metoda de adaugare in lista a obiectelor si va implementa cele doua
interfete (articolul despre interfete).
- Vertraulich / Confidential -

//clasa Conturi
//implementeaza interfetele
classConturi:IEnumerable,IEnumerator
{
//construim un vector
ArrayListlistaConturi=newArrayList();
//variabila care va returna
//pozitia curenta a enumeratorului
privateintpozitie=1;
//metoda pentru adaugarea unui obiect de tip
// in lista
publicvoidAddEmployee(Contc)
{
//adauga in lista
listaConturi.Add(c);
}
//implementarea interfetei IEnumerable
//va returna un enumerator
publicIEnumeratorGetEnumerator()
{
return(IEnumerator)this;
}
//implementarea interfetei IEnumerator
publicboolMoveNext()
{
if(pozitie<listaConturi.Count1)
{
//incrementam
++pozitie;
returntrue;
}
//nu mai sunt elemente in colectie
returnfalse;
}
publicvoidReset()
{
//pozitia initiala
pozitie=1;
}
publicobjectCurrent
{
get
{
//returneaza elementul indicat de enumerator
returnlistaConturi[pozitie];
}
}
}

In functia Main, creem colectia:


ConturiContList=newConturi();
- Vertraulich / Confidential -

//cconstruim obiecte de tip Cont


Contc1=newCont(1,"Cont#1",1250.75);
Contc2=newCont(2,"Cont#2",3131);
Contc3=newCont(3,"Cont#3",400);
//construim o colectie
ContList.AddEmployee(c1);
ContList.AddEmployee(c2);
ContList.AddEmployee(c3);

Construim obiectul enumerator:


IEnumeratorContEnumerator=ContList.GetEnumerator();

Initial, obiectul enumerator este situat inaintea primului element al colectiei. Vom apela
metoda Reset(), pentru a fi siguri de acest lucru:
ContEnumerator.Reset();

Parcurgem colectia:
//se invoca mai intai metoda MoveNext inainte de accesarea
//Current, altfel va aparea exceptie la executie
while(ContEnumerator.MoveNext())
{
Console.WriteLine((Cont)ContEnumerator.Current);
}

Atentie! Folosirea corecta a interfetei IEnumerator presupune mai intai apelul


metodeiMoveNext(), apoi accesarea proprietatii Current.
Obiectul enumerator nu are acces exclusiv asupra colectiei, parcurgerea cu ajutorul
acestuia nu este thread-safe, pentru ca in acelasi timp alte fire de executie pot aduce
modificari colectiei. O solutie ar fi blocarea colectiei in timpul parcurgerii.

49. Ce inseamna Enumerable? (see 48)


50. Ce inseamna AppDomain?

Un alt concept cu care opereaz o aplicaie din punct de vedere structural este domeniul
aplicaiei (AppDomain). Domeniul aplicaiei conine assembly-urile cu care opereaz o
aplicaie
O aplicatie consta din unul sau mai multe procese.
Un proces contine un program in executie. Un proces mai este definit si ca un spatiu de
memorie,
4GB, ce contine cod si date.
.NET subdivide un proces in subprocese, numite domenii de aplicatii, reprezentate de
- Vertraulich / Confidential -

System.AppDomain.
Unul sau mai multe fire managed (create in .NET) reprezentate de
System.Threading.Thread, pot rula in unul sau mai multe AppDomain din cadrul aceluiasi
proces. Fiecare AppDomain este startat cu un singur fir ; codul din acest AppDomain
poate crea alte AppDomain si fire.
Un fir este unitatea de baza la care SO aloca timp procesor. Un fir poate executa orice
parte de cod a unui proces, incluzand parti curente executate de alt fir.
Firul are propria stiva, deci variabilele locale sunt gestionate separat.
Un thread pool este o colectie de fire de lucru care executa asincron metode callback.
Thread pool furnizeaza un management al firelor de lucru.
C# suporta executia paralela a codului prin multithreading.
Un program client C# (Console, WPF sau Windows Forms) este startat intr-un singur fir
creat automat de CLR si de SO (fir principal, fir primar) si devine multifir prin crearea de
fire aditionale.
Un fir isi termina executia cand delegate-ul pasat in ctor Thread isi termina executia. O
data terminat, un fir nu poate fi restartat. Putem verifica daca un fir este in executie
folosind proprietatea IsAlive.
Spatiul de nume pentru fire este System.Threading.
51. Ce reprezinta Global.asax?

Structura unei aplicatii web in ASP .NET


ntr-o aplicaie web realizat cu ASP .NET vom avea urmtoarele tipuri de fiiere i
directoare importante
Fiiere cu extensia .aspx reprezint locul unde este stocat coninutul paginii web. Se
pot aduga elemente HMTL, javascript, controale ASP .NET server-side.
Fiierele cu extensia .cs reprezint codul ce se va executa pe server. Se poate scrie
cod C# sau Visual Basic. Se pot defini variabile, funcii, clase, etc.
Fiierul web.config este un fiier de configurare unde este stocat informaia
referitoare la aplicaia web. n acest fiier se pot defini mai multe proprieti ale
aplicaiei. De exemplu, putem defini string-ul de conectare la baza de date pentru a-l
putea folosi in orice pagin, sau putem modifica limita mrimii fiierelor upload-ate.
Fiierul Global.asax este opional i se poate folosi pentru a manipula anumite
evenimente cum ar fi Application_Start, Application_End, Session_Start, Session_End
Directorul BIN este folosit pentru a stoca diverse fiiere dll folosite ca i componente
sau controale n aplicaie.
Directorul App_Code conine cod ce se va compila i va fi vizibil n orice pagin a
aplicaiei web. Se pot stoca aici de exemplu diverse clase.
Directorul App_Data conine fiiere mdf specifice bazelor de date SQL sau Access.
52. Ce reprezinta CLR?

Cele trei entitati care stau la baza functionarii .Net sunt: CLR, CTS, CLS.
- Vertraulich / Confidential -

Common Language Runtime


Cel mai important concept in functionarea .NET il reprezinta Common Language
Runtime. El este un layer (nivel, strat) intre sistemul de operare si aplicatiile .Net.
Acestea nu comunica direct cu sistemul de operare, ci prin intermediul CLR.

Ca sa definim runtime putem spune ca poate fi inteles ca o colectie de servicii care


este apelata la executia unui anumite unitati de cod compilat.
Termenul runtime in .Net este reprezentat de Common Language Runtime (CLR).
Pentru dezvoltatorii Java, exista Java Virtual Machine.
Principalul scop al CLR este de a localiza, incarca si de a administra tipurile .Net. De
asemenea, se ocupa de managementul memoriei, al thread-uilor si de securitate. Pe
scurt, CLR se ocupa de executia programului.
Baza CLR o reprezinta un dll numit mscoree.dll (Common Object Runtime
Execution Engine).
Functionalitatile din CLR sunt disponibile pentru orice limbaj de programare .Net folosit.
Daca la runtime se folosesc exceptii pentru a raporta eventuale erori, atunci toate
limbajele vor receptiona erorile prin execeptii.
CLR nu stie ce limbaj de programare a fost folosit in fisierele cod-sursa ale
programului. Se poate folosi orice limbaj de programare atat timp cat compilatorul
acestuia este compatabil cu CLR.
O data cu lansarea .Net Framework 4.0, versiunea CLR a ajuns la 4.0.
- Vertraulich / Confidential -

Pentru mai multe informatii despre CLR, puteti urmari un interviu cu Ian Carmichael,
despre istoria si viitorul CLR.
Common Type System
.Net este independent de limbaj (suporta peste 20 de limbaje de programare diferite). Cu
toate acestea, un programator se poate folosi de tipurile de date specifice limbajului
preferat, fara a intampina probleme.
De exemplu, in fiecare limbaj exista un cuvant cheie unic pentru a defini un tip de baza
(o variabila de tip intreg este declarata in C# ca int, in Visual Basic este declarata
cainteger sau in C++ ca int. Acestea indica in cele din urma tipul de baza System.Int32
in .Net Framework, in assembly-ul mscrolib.dll.
Common Type System defineste modul in care tipurile de date urmeaza sa fie declarate
si administrate la executie. Functionalitatea principala a CTS este de a standardiza
conventiile pe care trebuie sa le respecte toate limbajele de programare din .Net. In plus,
CTS se ocupa si de type safety.
Cu ajutorul CTS se elimina probleme legate de overflow/underflow pentru datele
numerice, sau probleme despre reprezentarea tipurilor, de exemplu, string, boolean, etc,
in alte limbaje.
CTS suporta tipurile valoare si tipurile referinta.
Observatie: Un limbaj de programare .Net nu suporta fiecare functionalitate definita de
CTS.
Important de retinut este ca CTS este o specificatie formala care arata cum trebuie sa fie
definite tipurile pentru a fi gazduite de CLR. Probabil cei mai interesati de modul cum
functioneaza CTS sunt programatorii care dezvolta instrumente de
programare/compilatoare care au ca tinta platforma .Net.
Puteti accesa http://www.dotnetlanguages.net pentru a vedea o lista cu limbajele de
programare din .Net.
Common Language Specification
Fiecare limbaj de programare indica in mod unic, cu ajutorul sintaxei proprii, aceleasi
constructii de programarare (tipuri de date, controlul fluxului) programming

- Vertraulich / Confidential -

constructs. De exemplu, in C# concatenarea se poate face cu ajutorul operatorului +,


iar in VB se foloseste &.
Aceste diferente minore sunt aproapte neinsemnate pentru .Net runtime, deoarece
compilatoarele limbajelor respective emit acelasi set de instructiuni in limbaj MSIL.
CLS reprezinta regulile care descriu setul de functionalitati pe care un compilator .Net
trebuie sa il suporte pentru a produce cod care sa fie gazduit de CLR.
Regulile din CLS trebuie cunoscute de cei care dezvolta compilatoare si vor ca
produsele lor sa functioneze perfect in mediul .Net.
CLS Compliance
Exista situatii in care, in C#, este nevoie de programming constructs care nu sunt
conforme cu CLS. In aceste cazuri, se poate folosi atributul CLSCompliant pentru a
instrui compilatorul sa verifice fiecare linie de cod din punct de vedere al regulilor CLS.
Daca sunt gasite incalcari ale acestor reguli, vor fi afisate erori de compilare.
Microsoft Intermediate Language
Cand se compileaza un program .Net, codul sursa nu se converteste in cod binar, ci intrun cod intermediar numit Micrososft Intermediate Language (MSIL) sau, dupa
noua denumire, Common Intermediate Language.

Toate compilatoarele limbajelor .NET emit instructiuni CIL si metadata.


Cand un *.dll sau *.exe a fost creat cu un compilator .Net, se foloseste termenul
abstract assembly.
- Vertraulich / Confidential -

Un assembly contine cod CIL (este similar notiunii de bytecod din JAVA) si metadata. De
exemplu, daca am clasa Agent, metadata va contine detalii despre clasa de baza a
clasei Agent, despre interfetele implementate si informatii despre fiecare membru al
clasei.
Un assembly este la randul lui descris folosind metadata. Aceste informatii reprezinta
un manifest (detalii despre versiunea curenta a assembly-ului, referinte catre assemblyuri externe).
In cele mai multe cazuri, exista o singura corespondenta intre un assembly .Net si un
fisier binar (.dll,.exe). In cazul in care scriem un program pentru desktop, executabilul
poate fi referit ca assembly-ul in sine.
Daca un assembly este compus dintr-un singur dll sau exe atunci se numeste singlefile assembly. Acesta contine instructiunile CIL, metadata si fisierul manifest intr-un
pachet bine definit, independent.
Daca un assembly este compus din mai multe fisiere binare, el se numeste multi-file
assembly. Fiecare fisier component poarta numele de modul. Unul din aceste module
trebuie sa fie considerat principal si sa contina fisierul manifest al assembly-ului.
Codul MSIL contine instructiuni care sunt independente de orice CPU. Este treaba CLR
sa transforme acest cod intermediar intr-un cod executabil pe un mediu in care regulile
CLR sunt implementate.
Compilatorul JIT
Atunci cand codul CIL compilat trebuie sa fie executat, CLR invoca compilatorul Just In
Time (Jitter). Acesta va compila instructiunile CIL in cod executabil specific masinii sau
sistemului de operare. Compilatoarele JIT se diferentiaza de cele traditionale prin faptul
ca ele transforma codul CIL in cod nativ doar cand e nevoie. De exemplu, atunci cand o
functie este apelata, codul CIL al functiei este convertit in cod nativ chiar atunci,just in
time. Daca o sectiune de cod CIL este convertita la cod nativ, data viitoare cand este
nevoie de aceasta, CLR va folosi aceeasi copie (deja compilata) fara a recompila.
Compilatoarele JIT optimizeaza codul in functie de procesor si sistem de operare, la
executie. Microsoft spune ca C# si .Net nu concureaza cu C++ din punct de vedere al
eficientei si al vitezei de executie, dar in anumite cazuri datorita compilatoarelor JIT,
codul poate devine mai rapid decat in C++.

- Vertraulich / Confidential -

Base class libraries


Pe langa CLR si specificatiile din CLS/CLR, platofrma .NET pune la dispozitie o librarie
pentru toate limbajele de programare din .Net.
BCL incapsuleaza functii pentru lucrul cu thread, I/O, grafica, interactiune cu dispozitive
hardware externe. De asemea, BCL furnizeaza suport pentru servicii apelate de aplicatii
din lumea reala (acces la baza de date, manipularea documentelor XML, securitate).
BCL a fost actualizata cu fiecare versiune de .Net Framework.
Observatie: A nu se confunda BCL cu FCL. Chiar daca nu are un mare impact asupra
dezvolatorilor, consider ca este util sa cunoastem aceste diferente.
FCL reprezinta tot ce este inclus in instalarea .Net (ADO.NET, ASP.NET, WPF, etc).
BCL reprezinta o parte din ECMA (European Computer Manufacturers Association)
pentru Common Language Infrastructure.
Concluzii
In ansamblu, .Net Framework se bazeaza pe un motor de executie, runtime,
(mscoree.dll) si pe o vasta librarie de clase (mscorlib.dll plus alte referinte).
Assembly-urile .Net pot fi dezvoltate sau rulate pe o platforma non-Microsoft
datoritaCommon Language Infrastructure (CLI).
CLR poate gazdui orice assembly care se supune regulilor codului managed. Assemblyurile contin instructiuni CIL care sunt compilate in instructiuni specifice masinii/platformei
de un compilator JIT.
Exista implementari ale .Net Framework, open-source, de exemplu, Mono, care permit
programelor sa ruleze pe Mac Os si Unix.

- Vertraulich / Confidential -

Sunt cazuri in care, datorita functionalitatilor si flexibilitatii oferite, sa intervina costuri


mai mari la executie in ceea ce priveste performanta.
Versiuni de .Net Framework ruleaza pe Windows, PocketPC, pe Zune media player, in
Azure Cloud, chiar si pe consolele de jocuri Xbox.

53. Exemple de limbaje sub platforma .NET.


54. Ce este JIT? (see 52)
55. Ce este ATLAS?
56. StringBuilder vs String.

In acest exemplu, sirul s1 este creat si apoi modificat. In acest fel exista doua versiuni
ale variabilei s1 ce vor fi stocate temporar in memorie. Metoda string.Concat creaza un nou
sir si concateneaza s1 cu rezultatul metodei ToString. Rezultatul acestei concatenari este o
noua locatie de memorie. Cand o astfel de operatie apare intr-o bucla, pot apare probleme
cu memoria si performanta generala a programului.
Solutia este sa utilizati clasa StringBuilder din spatiul de nume System.Text.
StringBuilder aloca initial un spatiu pentru 16 caractere; daca sirul devine mai mare decat
atat, el este marit automat. In urmatorul exemplu va fi alocat un singur string:

57. Cum pot masura performanta unui site ASP.NET?


58. Ce inseamana o clasa template?
Clasele i funciile template sunt abloane pe baza crora se pot genera clase i funcii
folosind un mecanism de expandare asemntor cu macrodefiniiile cu parametri. Spre
deosebire de macrodefiniii, template-urile ofer mecanisme de nlocuire doar pentru
tipuri de date i constante, ns au avantajul unei verificri mai bune de ctre
compilator.
Sintaxa utilizat pentru definirea abloanelor de funcii este:
template <class T1, class T2, , class Tn, tip1 c1, , tipm cm> prototip_functie

Mecanismul se poate folosi asemntor i pentru construirea abloanelor de clase. Sintaxa


este:
template class nume_clas {}
Metodele implementate inline n cadrul clasei folosesc sintaxa obinuit. n cazul n care se
dorete implementarea metodelor n afara clasei se va folosi sintaxa:

- Vertraulich / Confidential -

template tip_returnat nume_clas< T1, T2, , Tn, c1, , cm >:: nume_functie(param){}


59. Ce reprezinta un WebPart?
60. Cum pot comunica 2 WebPart-uri?
61. Ce este un Master Page?
62. Pot interactiona dintr-o pagina cu Master Page? Oricum?
63. Cum pot incarca dinamic un control in ASP.NET?
64. Ce este Garbagge Collector? (see 19 , 25)
65. Ce reprezinta DataBind intr-o pagina web?

DataBinding este o caracteristica puternica, oferit de .NET framework, care permite


elementelor vizuale intr-un client sa se conecteze la o sursa de date, cum ar fi DataSets,
DataViews, Array, etc. O conexiune este stabilit intre sursa si element, astfel incit orice
modificiri aduse la sursa de date sunt reflectate imediat n elementul vizual si vice-versa.
Page.DataBind() versus Control.DataBind()

Dup sursele de date special au fost determinat i setat pentru obiectele


din pagina .aspx, trebuie s legai datele la aceste surse de
date. UtilizaiPage.DataBind sau metoda Control.DataBind a lega datele la
surse de date.
Ambele metode funcioneaz la fel. Diferena principal este c toate sursele
de date sunt legate la comenzile server dup metoda Page.DataBind este
apelat.Datele nu este redat la controlul pn cnd apelai explicit
fie DataBind metoda de control de server Web sau pn cnd invoca
metoda Page.DataBind nivel de pagin. De
obicei, Page.DataBind (sau DataBind) este numit din
Evenimentul Page_Load .
66. Ce inseamna Smart Navigation?
67. Ce inseamna Strong Typed Collection? Exemplu.
Generice i colecii de generice (eng. generics) .NET Framework 2.0 Beta introduce
suport pentru generice n scopul facilitrii scrierii de cod flexibil i reutilizabil.
Acestea acioneaz ca template-uri, permind claselor, structurilor, interfeelor,
metodelor i delegate-urilor s fie declarate i definite cu specificarea parametrilor de tip
generic, specificarea exact a tipului realizndu-se la utilizarea genericului.
Diferite namespace-uri precum System.Collections.Generic furnizeaz clase i metode
generice i pentru colecii de tipuri tari (eng. strongly typed collections).
System.Nullable<T> este reprezentarea general pentru valori opionale.
ex: ArrayList, List, Array

- Vertraulich / Confidential -

Exista si StringCollection, o colectie tipizata. Impreuna cu alte colectii din .Net care sunt
strongly typed, aceste clase tipizate sunt usor de folosit in dezvoltare datorita faptului ca
Visual Studio poate face automat validarea si nu mai e nevoie sa folosim conversia.
68. Ce inseamna un array?
Provides methods for creating, manipulating, searching, and sorting arrays, thereby
serving as the base class for all arrays in the common language runtime.
The Array class is not part of the System.Collections namespaces. However, it is still
considered a collection because it is based on the IList interface.
69. Exista pointeri in C#? Daca da unde se pot folosi?
70. Ce inseamna stride?
71. Ce reprezinta ThreadPool?

A thread pool is a collection of threads that can be used to perform several tasks in the
background. (See Using Threading (C# Programming Guide) for background information.)
This leaves the primary thread free to perform other tasks asynchronously.
Thread pools are often employed in server applications. Each incoming request is
assigned to a thread from the thread pool, so that the request can be processed
asynchronously, without tying up the primary thread or delaying the processing of
subsequent requests.
Once a thread in the pool completes its task, it is returned to a queue of waiting threads,
where it can be reused. This reuse enables applications to avoid the cost of creating a
new thread for each task.
Thread pools typically have a maximum number of threads. If all the threads are busy,
additional tasks are put in queue until they can be serviced as threads become available.

Un thread pool este o colectie de fire de lucru care executa asincron metode callback. Thread
pool furnizeaza un management al firelor de lucru.

72. Cum pot la apasarea tastei Enter sa fac submit la o pagina ASP.NET ca si cum as fi
apasat un anume buton?
73. Ce reprezinta uncheked?
74. Ce reprezinta unsafe?
75. Ce reprezinta Click and Deploy tehnology?(Publish)

- Vertraulich / Confidential -

76. Ce este un assembly? Dar o referinta?


77. Care e diferenta intre Typed Data Set si UnTypedDataSet?
78. Poate un DataGrid contine un alt DataGrid?
79. 3 exemple de surse de date pentru un DataList!
80. Ce inseamana cuvantul cheie is?
81. Ce inseamna clientside validation? Ce inseamna browserside validation?
82. Ce este un Windows Service?
83. Ce inseamna "Code Behind"?
84. Cum pot pagina un grid in ASP.NET 2.0 automat?
85. Cum se poate restarta IIS-ul din consola?
86. Ce este Smart navigation?
87. 3 exemple de interfete in C#.
88. Ce este clone?
89. Ce reprezinta boxing si unboxing?
90. Poate avea o functie in C# un nr variabil de parametri? Daca da, cum?
91. 3 moduri in care putem configura un program sau un site web.
92. Moduri in care putem sa face din protocolul Http un protocol cu stari dintr-unul fara
stari.
93. Ce este tehnica double buffer si la ce foloseste?
94. Ce reprezinta directorul dintr-o site asp.net App_code si la ce se foloseste?
95. Cum se poate transmite un mesaj de tip Email din C#?
96. Ce reprezinta proprietatea Tag a unui control?
97. Se poate deactiva proprietatea View State?

Design Patterns.
1. Ce este un singleton?

Creational patterns - sabloane care ajuta la crearea de obiecte in loc sa trebuiasca sa fie
instantiate direct. Astfel se ofera mai multa flexibilitate permitind sa se decida ce obiecte
trebuie sa fie create intr-o anumita situatie data.

- Vertraulich / Confidential -

Builder

construieste

obiecte

complexe

separind

partea

de

constructie

de

cea

de

reprezentare.
Factory Method - creaza obiecte fara a specifica clasa obiectului ce va fi creat
Abstract Factory - grupeaza fabrici de obiecte care au ceva in comun.
Prototype - creaza obiecte clonind un obiect existent.
Singleton - creaza/returneaza o singura instanta a unei clase.

Conceptul se numeste singleton. Reprezinta o tehnica prin care se limiteaza numarul de instante
ale unei clase la una singura. Cu alte cuvinte nu pot construi decat un singur obiect din aceasta
clasa.
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// constructorul este privat si nu permite crearea unei noi instante
private Singleton() {}
// nu este obligatoriu numele getIntstance(), insa acesta se foloseste
// de obieci
public static Singleton getInstance() {
return INSTANCE;
}
}
2. Ce este un adapter?
Structural patterns - Se refera la compunerea claselor si a obiectelor pentru a obtine noi
functionalitati.
Adapter

permite

claselor

cu

interfete

incompatibile

sa

lucreze

impreuna

(adapteaza

interfata la cealalta prin adaugarea unei interfete wrapper).


Bridge - decupleaza o clasa abstracta de implementarea sa a.i cele doua sa poata varia
independent.
Composite - compune mai multe obiecte similare a.i ele pot fi manipulate ca un singur
obiect.
Decorator - adauga dinamic noi functionalitati la o metoda existenta
Facade - furnizeaza o interfata simplificata la o portiune mare de cod
Flyweight - reduce costul crearii si manipularii unui numar mare de obiecte similare.
Proxy - furnizeaza un obiect de tip

placeholder (tipic local) pentru a accesa un alt obiect

(tipic remote).

- Vertraulich / Confidential -

"Adaptor". Acest model particular poate fi folosit atunci cand codul vostru
depinde de API-uri externe sau orice alta clasa predispusa schimbarilor
frecvente. Acest model face parte din categoria "modelelor structurale"
deoarece ne invata modul in care codul si clasele noastre trebuie
structurate pentru a le putea organiza si/sau extinde cu usurinta.
Din nou, as vrea sa readuc in discutie faptul ca design pattern-urile nu aduc
nimic nou fata de clasele traditionale. In schimb, ne ajuta sa intelegem mai
bine modul in care trebuie sa ne structuram clasele, cum putem manipula
comportamentul lor si cum putem organiza crearea acestor clase.

using System;
2
3
// Adapter Pattern - Simple
Judith Bishop Oct 2007
4
// Simplest adapter using interfaces and inheritance
5
6
// Existing way requests are implemented
7
class Adaptee {
8
// Provide full precision
9
public double SpecificRequest (double a, double b) {
10
return a/b;
11
}
12
}
13
14
// Required standard for requests
15
interface ITarget {
16
// Rough estimate required
17
string Request (int i);
18
}
19
- Vertraulich / Confidential -

20
// Implementing the required standard via Adaptee
21
class Adapter : Adaptee, ITarget {
22
public string Request (int i) {
23
return "Rough estimate is " + (int) Math.Round(SpecificRequest
(i,3));
24
}
25
}
26
27
class Client {
28
29
static void Main ( ) {
30
// Showing the Adapteee in standalone mode
31
Adaptee first = new Adaptee( );
32
Console.Write("Before the new standard\nPrecise reading: ");
33
Console.WriteLine(first.SpecificRequest(5,3));
34
35
// What the client really wants
36
ITarget second = new Adapter( );
37
Console.WriteLine("\nMoving to the new standard");
38
Console.WriteLine(second.Request(5));
39
}
40
}
41/* Output
42
Before the new standard
43
Precise reading: 1.66666666666667
44
45
Moving to the new standard
46
Rough estimate is 2
47
*/
3. Ce este un enumerator?
MS SQL 2000
1. Ce reprezinta o tranzactie? (see 10 de la C#)
2. De cate tipuri sunt joinurile? Comentarii!

Indiferent de sintaxa folosit exist mai multe moduri de legare a tabelelor i anume:

Produsul cartezian leag fiecare nregistrare dintr-o tabel cu toate


nregistrrile din cealalt tabel.

Equijoin sunt legate dou tabele cu ajutorul unei condiii de egalitate

NonEquijoin - n acest caz condiia de join folosete alt operator dect


operatorul de egalitatea

SelfJoin este legat o tabel cu ea nsi, e folosit de obicei n conjuncie cu


relaiile recursive.

- Vertraulich / Confidential -

OuterJoin sunt o extensie a equijoinului, cnd pentru unele nregistrri dintro tabel nu exist corespondent n cealalt tabel, i dorim ca aceste nregistrri
fr corespondent s fie totui afiate.

3. Ce reprezinta un cursor?
4. Care sunt cuvintele cheie pentru SELECT?
5. Care este diferenta intre HAVING si WHERE?
6. Ce inseamna functii agregat?
7. Ce reprezinta trigerele?
8. Care e diferenta intre proceduri stocate si functii?
9. Ce reprezinta un index, dar un index clustered?
10. Ce reprezinta un connection pool?
11. SQL 2005 nu vine din start cu connection=-ul de pe alte calculatoare enabled. Ce
trebuie sa fac sa permit aceasta?
12. Care sunt avantajele procedurilor stocate? Cand se recompileaza procedurile stocate
pe server?
12. Ce reprezinta Delete Cascade?
Intrebari generale
1. ce este o sectiune critica?
2. Care e diferenta intre thread si proces?
3. Ce reprezinta un semafor?
4. Ce reprezinta un proces sau thread zombie?
5. Care e diferenta intre un socket UDP si unu TCP/IP?
6. Ce este un DTD?
7. Ce este un XML Schema?
8. Ce este un XSL?
9. Ce este XHTML?
10. Ce este un deadlock? Exemplu.
11. Ce este DOM?
12. Deadlock. Ce este ? Exemplu.
13. Ce este stiva? Dar heapul?

- Vertraulich / Confidential -

14. Ce este un HashTable?


15. Ce este recursivitatea? Exemplu.
16. 3 Exemple de algortimi de sortare
17. Ce este un SQL injection?
18. Ce este o conditie de race? Exemplu.
19. Ce este un pointer?

- Vertraulich / Confidential -