Sunteți pe pagina 1din 46

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

internal acces permis doar in clasa sau spatiul de nume in care e cuprinsa

protected acces in clasa curenta sau in cele derivate

private implicit.Doar pentru clasele interioare

folosit pentru clasele interioare semnificand accesul in clasa care-l


protected internal contine sau in tipurile derivate din 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 functional al unei


internal aplicatii .Net

- Vertraulich / Confidential -
accesibil oricarui membru al clasei care-l
protected contine si al claselor derivate

implicit. acces permis doar pentru clasa


private care contine membrul

accesibil oricarui membru al al clasei care il


contine si al claselor derivate, precum si in
protected internal blocul 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
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.

- Vertraulich / Confidential -
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
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.

- Vertraulich / Confidential -
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:
using System.Threading;
class Numara
{
//numara pana la 10
public void Zece()
{
Console.WriteLine("Simple Thread");
for (int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
}
}
}
in main():

Numara numara = new Numara();


//obiectul Thread
Thread thread1 = new Thread (new ThreadStart(numara.Zece));
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
Thread thread1 = new Thread (new ThreadStart(numara.Zece));
Thread thread2 = new Thread(new ThreadStart(numara.Zece));

thread1.Name = "Thread One";


thread2.Name = "Thread Two";

thread1.Start();
thread2.Start();

public void Zece()


{
for (int i = 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

- Vertraulich / Confidential -
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)

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 sãi 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 celãlalt capãt a
altor facilitãti decât 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 rãspunsurile sunt primite ca documente
XML sau JSON;
- Servicii de tip SOAP (Simple Object Access Protocol), în care cererile si rãspunsurile 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 cãtre “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 decât 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?

- Vertraulich / Confidential -
Controalele ASP.NET au o proprietate extrem de importantă din punct de vedere al
performanței: își păstrează starea între postback-uri. ViewState-ul, căci despre el e
vorba, ne ajută din acest punct de vedere, dar prezintă și dezavantaje care vin cu
stocarea stării 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 când se consideră că nu este
necesar.

Session tine informatia pe server, iar ViewState pe client. Sintaxa ViewState este identica
cu Session.

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
proprietățile 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:

- Vertraulich / Confidential -
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

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)
{

- Vertraulich / Confidential -
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?


O metodă prin care utilizatorul se poate autentifica înainte de a-i fi permise anumite
operaţii, respectiv adăugarea şi editarea. Acest mecanism se bazează pe noţiumea de
Sesiune.
O sesiune permite serverului de web să asocieze un set de date cu un anumit tip de
browser. Prin aceasta, browserul ramâne, hai să spunem “agăţat” în prima pagină pe
care o afişează. Informaţia utilizată pentru aceasta este unică şi este utilizată ca şi cheie
de validare pentru accesul la următoarele 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ă când pagina de web este reânărcată. LA primul apel al
paginii de web, cookie-ul nu există, astfel încât 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 informaţii într-un cookie, dar deoarece cu cât mai multa
informaţie este stocată, cu atât mai multă memorie este necesară la server, uzual
cookie+ul conţine un număr minim de informaţii.
Bazat pe acest mecanism, să încercăm să restricţionăm accesul în adăugare şi
editare. Informaţia 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 execuţie a unei funcţii numite Session_Start(), localizată în Global.asax. Să
adăugăm această funcţie:
protected void Session_Start(Object sender, EventArgs e)
{
Session["permis"] = false;
}
Proprietatea Session permite adăugarea de variabile, numite variabile de sesiune.
În funcţie, noi am adăugat o variabilă numită permis, căreia i-am atribuit valoarea false.
Deci, la încărcarea paginii Default.aspx, această variabilă va fi făcută 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?

- Vertraulich / Confidential -
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.
- Metoda  abstracta (public abstract int CalculateWage();
) 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
sealed class M
{

- 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:
Person p = new Person("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:
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();
}

- Vertraulich / Confidential -
}
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.
class Baza
{
public virtual void Afiseaza()
{
Console.WriteLine("Apelul functiei Afiseaza din clasa de baza\n");
}
}

class Derivata : Baza


{
public override void Afiseaza()
{
Console.WriteLine("Apelul functiei Afiseaza din clasa derivata");
}

}
Derivata obiect2 = new Derivata();
//instantiem pe un obiect din clasa derivata
Baza obiect1 = obiect2;
//afiseaza functia din clasa de Baza
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?

- Vertraulich / Confidential -
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.

bool createdNew = false;

//numele unic al aplicatiei


Mutex mutex = new Mutex(true, "SingleInstamce", out createdNew);

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

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.

- Vertraulich / Confidential -
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.
protected override void Finalize()
{

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

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.

- Vertraulich / Confidential -
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>
public class Persoana : IDisposable
{
public string Nume { get; set; }
public string Prenume { get; set; }

public override string ToString()


{
return string.Format("{0} {1}", Nume, Prenume);
}

public Persoana(string nume, string prenume)


{
Nume = nume;
Prenume = prenume;
}

public int CalculeazaVarsta()


{
return 25;
}

public void Dispose()


{
//cod pentru eliberarea resurselor
Console.WriteLine("Disposed");
}
}
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 (Persoana p = new Persoana("Nume","Persoana"))
{

- Vertraulich / Confidential -
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?


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.

- Vertraulich / Confidential -
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.
Un exemplu simplu de tratare a exceptiei DivideByZeroException si de folosire a
blocului try – catch – finally:
try
{
int x = 0;
//raise the exception
int y = 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.
static void Compute(int [] numbers)
{
try
{
int secondNumber = numbers[0];
Console.Write(secondNumber);
}

catch (IndexOutOfRangeException)
{
Console.WriteLine("Must provide more than an argument");
}

catch (NullReferenceException)
{
Console.WriteLine("Argument is null");

- Vertraulich / Confidential -
}

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.
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 (Exception exception)
{
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)

throw new ArgumentNullException("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.
static void ReadFile()
{
StreamReader reader = 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.
class Compute
{

public void DivideTwoNumbers(int x, int y)


{
try
{
var result = x / y;
}

catch(DivideByZeroException)
{
// the control goes back to parent method
throw;
}
}
}
In metoda Main :
static void Main(string[] args)
{
Compute comp = new Compute();

try
{
comp.DivideTwoNumbers(5, 13);
}

catch(DivideByZeroException)
{
Console.WriteLine("Exception caught here");
}
}
System.Exception
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

- Vertraulich / Confidential -
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 clienţii (serviciu requesters) pentru a
uşura dezvoltatorii în dezvoltarea de aplicaţii web. Structura include un
număr 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 secţiuni separate pentru
prezentarea, procesarea cererii și proceselor de gestionare a datelor. 

Acesta este adesea vazut că atât clienţi şi servere se supună comunicarea


printr-o reţea de calculator comune, dar utilizând hardware separat. Sistemul
de calcul al furnizorilor de servicii (server) găzdui un număr 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 stabileşte un model pentru dezvoltatori web
pentru a crea aplicatii web personalizate ca pe cerinţele specifice de afaceri. 

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


separa uşor aplicaţii în mai multe niveluri şi pot modifica-le mai degrabă
decât rescrierea întreaga aplicaţie. În plus, cererile sunt vag conectat cu
fiecare alte şi modificările făcute într-o aplicaţie împiedică performanţă
altora. 

În general, dezvoltatorii de aplicaţii web utilizaţi 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
înţelege cu uşurinţă informaţii legate de servicii. Acest nivel superior a

- Vertraulich / Confidential -
structurii cererii interacţionează cu alte niveluri prin furnizarea de rezultate
pentru toate celelalte niveluri în reţeaua de calcul. Nivelul de logica
controlează funcţionarea aplicaţiei de procesare comenzi, evaluare şi calcul
datele specifice. Informaţii de programare strat ulterior este stocată în
servere de baze de date de nivelul de date. Informaţiile 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?

Supraîncărcarea operatorilor
Supraîncărcarea operatorilor în C# se face numai prin metode statice membre în clase.
Există trei forme de supraîncărcare:
• Operatori de conversie expliciţi (conversia trebuie făcută implicit printr-un
cast) sau impliciţi (conversia poate fi făcută automat de către compilator):
public static implicit operator tip_returnat (NumeClasa param);
sau
public static explicit operator tip_returnat (NumeClasa param);

• Operatori unari pentru supraîncărcarea operatorilor +, -, ~, !, ++ şi --:

public static tip_returnat operator operatorul (NumeClasa param);


• Operatori binari pentru supraîncărcarea operatorilor +, -, *, /, %, &, |, ^, <<,
>>, ==, !=, >, <, >= şi <=:

public static tip_returnat operator operatorul (NumeClasa param, tip operand2);

Se observă că nu poate fi supraîncărcat operatorul de atribuire. Unii operatori trebuie


supraîncărcaţi numai în pereche (== şi !=, < şi >, <= şi >=). În cazul în care se
supraîncarcă unul din operatorii binari +, -, /, *, |, &, ^, >>, <<, compilatorul va
genera automat şi supraîncărcări pentru operatorii derivaţi +=, -=, /=, *=, |=, &=, ^=,
>>=, <<=.

Exemplu de supraîncărcări 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


// 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++)

- Vertraulich / Confidential -
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.
    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
delegate int StringLengthDelegate(string str);
delegate string StringReverseDelegate(string str);
Intr-o clasa, construim functiile care vor fi apelate prin delegate.
class DelegateTest
{
//returneaza numarul de caractere al unui sir de caractere
public int StringLength(string str)
{
Console.WriteLine("Va returna numarul de caractere");
return str.Length;
}

//returneaza sirul inversat


public string StringReverse(string str)

- Vertraulich / Confidential -
{
string temp = "";
int i;
Console.WriteLine("Inverseaza sirul.");
//parcurgem sirul invers si concatenam
for (i = str.Length - 1; i >= 0; i--)
temp += str[i];
return temp;
}
}
In metoda Main :
DelegateTest test = new DelegateTest();

//construim delegat
StringLengthDelegate strLength = new StringLengthDelegate(test.StringLength);
//sirul care va fi transmis functiilor
string str;
//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
StringReverseDelegate strReverse = new StringReverseDelegate(test.StringReverse);
//apelul unei metode prin intermediul delegarii
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
delegate void MulticastDelegat(string str);
//construim delegatii
MulticastDelegat multiDel;
MulticastDelegate StringLength = new MulticastDelegat(test.StringLength);
MulticastDelegat StringReverse = new MulticastDelegat(test.StringReverse);
multiDel = StringLength;
//crearea unui delegat multicast
multiDel += StringReverse;

- Vertraulich / Confidential -
    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.

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;

- Vertraulich / Confidential -
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?

un assembly mai conține și o secțiune numită Manifest care conține metadate ce descriu
setul de fișiere dintr-un assembly. Din punct de vedere fizic, un assembly se poate identifica
printr-un fișier dll sau exe. Un alt concept cu care operează o aplicație din punct de vedere
structural este domeniul aplicației (AppDomain). Domeniul aplicației conține assembly-urile
cu care operează o aplicație

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

- Vertraulich / Confidential -
{
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";
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 thread-uri)


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.

- Vertraulich / Confidential -
     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:


using System.Threading;
     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. //PAS1 instanta ThreadStart
ThreadStart firstThreadStarg = new ThreadStart(Count);

3. 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. //PAS2 instanta THREAD
Thread firsThread = new Thread(firstThreadStart);

5. 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:
private void Count()
{
for(int i=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.
private void Count()
{
for(int i=0; i<100000;i++)
{
result = +i;
this.Invoke(new EventHandler(UpdateControl));
}
}

private void UpdateControl(object sender, EventArgs e)


{
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 fișier binar se face prin serializare. Serializarea este o metodă ce
permite transformarea unui obiect într-o secvență de octeți din care să poată fi refăcut
ulterior obiectul original. Serializarea permite unui obiect să fie convertit într-un flux de date,
care apoi este salvat într-un fișier binar.

Operația de serializare presupune parcurgerea etapelor:

- Vertraulich / Confidential -
• declararea unei clase ca fiind serializabilă, prin adăugarea înaintea definiției clasei a
atributului [Serializable]
• adăugarea bibliotecilor corespunzătoare: using System.IO; using
System.Runtime.Serialization. Formatters.Binary;

• instanțierea unui obiect din clasa FileStream: FileStream fileStream = new


FileStream("stud.dat", FileMode.Create, FileAccess.Write);

• instanțierea 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 numește
deserializare. Operația de deserializare presupune parcurgerea etapelor:

• instanțierea unui obiect din clasa FileStream: FileStream fileStream = new


FileStream("stud.dat", FileMode.Open, FileAccess.Read);

Citirea dintr-un fișier XML se poate face utilizând metoda Read() din clasa abstractă
XmlReader din namespace-ul System.Xml. Pașii pentru citire și parsare fișier XML:

• instanțierea unui obiect din clasa StreamReader: StreamReader sr = new


StreamReader("nbrfxrates.xml");

• citirea conținutului fișierului: string str = sr.ReadToEnd();

• obținerea 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!

Până acum am văzut cum se pot salva şi restaura în şi din fişiere datele de tip
octet sau caracter. Dar ce e de făcut, 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 octeţi, dar va fi foarte greu la restaurare să împărţim octeţii astfel
încât 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 fişierelor. Acest mecanism poartă denumirea de
serializare.
Orice clasă ale cărei obiecte pot fi salvate sau restaurate prin intermediul
fişierelor, va trebui fie să fie declarată serializabilă, fie să implementeze o interfaţă
specifică, numită ISerializable. În momentul în care infrastructura primeşte o cerere
de serializare a unor obiecte, va verifica întâi dacă clasa din care fac parte obiectele
implementează interfaţa ISerializable şi dacă nu, va verifica dacă a fost declarată ca
fiind serializabilă. Dacă nici una din condiţii nu este îndeplinită, obiectele nu vor
putea fi serializate.

namespace unu_unu
{
[Serializable]
class Rezervare
{

- Vertraulich / Confidential -
public Rezervare()
{
}
public String Nume;
public DateTime DataS;
public DateTime DataP;
public 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
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

- Vertraulich / Confidential -
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
private int numarCurent;
private string numeTitular;
private double sold;

//constructor
public Cont(int numarCurent, string numeTitular, double sold)
{
this.numarCurent = numarCurent;
this.numeTitular = numeTitular;
this.sold = sold;
}

//suprascriem functia
//pentru a afisa toate variabilele membru
public override string ToString()
{
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).
//clasa Conturi
//implementeaza interfetele
class Conturi : IEnumerable,IEnumerator
{
//construim un vector
ArrayList listaConturi = new ArrayList();

//variabila care va returna


//pozitia curenta a enumeratorului
private int pozitie = -1;

//metoda pentru adaugarea unui obiect de tip


// in lista
public void AddEmployee(Cont c)
{
//adauga in lista
listaConturi.Add(c);
}
//implementarea interfetei IEnumerable
//va returna un enumerator
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;

- Vertraulich / Confidential -
}

//implementarea interfetei IEnumerator

public bool MoveNext()


{
if (pozitie < listaConturi.Count - 1)
{
//incrementam
++pozitie;
return true;
}
//nu mai sunt elemente in colectie
return false;
}

public void Reset()


{
//pozitia initiala
pozitie = -1;
}

public object Current


{
get
{
//returneaza elementul indicat de enumerator
return listaConturi[pozitie];
}
}
}
In functia Main, creem colectia:
Conturi ContList = new Conturi();

//cconstruim obiecte de tip Cont


Cont c1 = new Cont(1, "Cont#1", 1250.75);
Cont c2 = new Cont(2, "Cont#2", 3131);
Cont c3 = new Cont(3, "Cont#3", 400);

//construim o colectie
ContList.AddEmployee(c1);
ContList.AddEmployee(c2);
ContList.AddEmployee(c3);
   Construim obiectul enumerator:
IEnumerator ContEnumerator = 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);

- Vertraulich / Confidential -
}
   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 aplicație din punct de vedere structural este domeniul
aplicației (AppDomain). Domeniul aplicației conține assembly-urile cu care operează o
aplicație

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
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 aplicaţie web realizată cu ASP .NET vom avea următoarele tipuri de fişiere şi
directoare importante

Fişiere cu extensia .aspx reprezintă locul unde este stocat conţinutul paginii web. Se
pot adăuga elemente HMTL, javascript, controale ASP .NET server-side.

Fişierele cu extensia .cs reprezintă codul ce se va executa pe server. Se poate scrie


cod C# sau Visual Basic. Se pot defini variabile, funcţii, clase, etc.

Fişierul web.config este un fişier de configurare unde este stocată informaţia

- Vertraulich / Confidential -
referitoare la aplicaţia web. În acest fişier se pot defini mai multe proprietăţi ale
aplicaţiei. De exemplu, putem defini string-ul de conectare la baza de date pentru a-l
putea folosi in orice pagină, sau putem modifica limita mărimii fişierelor upload-ate.

Fişierul Global.asax este opţional ş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 fişiere dll folosite ca şi componente
sau controale în aplicaţie.

Directorul App_Code conţine cod ce se va compila şi va fi vizibil în orice pagină a


aplicaţiei web. Se pot stoca aici de exemplu diverse clase.

Directorul App_Data conţine fişiere 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.
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.

- Vertraulich / Confidential -
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.

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

- Vertraulich / Confidential -
Fiecare limbaj de programare indica in mod unic, cu ajutorul sintaxei proprii, aceleasi
constructii de programarare (tipuri de date, controlul fluxului) – programming 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 intr-
un 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.
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.

- Vertraulich / Confidential -
Un assembly este la randul lui descris folosind metadata. Aceste informatii reprezinta
un manifest (detalii despre versiunea curenta a assembly-ului, referinte catre assembly-
uri 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 single-file
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++.

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.

- Vertraulich / Confidential -
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. Assembly-
urile 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.

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

- Vertraulich / Confidential -
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 funcţiile template sunt şabloane pe baza cărora se pot genera clase şi funcţii
folosind un mecanism de expandare asemănător cu macrodefiniţiile cu parametri. Spre
deosebire de macrodefiniţii, template-urile oferă mecanisme de înlocuire doar pentru
tipuri de date şi constante, însă au avantajul unei verificări mai bune de către
compilator.
Sintaxa utilizată pentru definirea şabloanelor de funcţii este:

template <class T1, class T2, …, class Tn, tip1 c1, …, tipm cm> prototip_functie

Mecanismul se poate folosi asemănător şi pentru construirea şabloanelor de clase. Sintaxa


este:
template class nume_clasă {…}

Metodele implementate inline în cadrul clasei folosesc sintaxa obişnuită. În cazul în care se
doreşte implementarea metodelor în afara clasei se va folosi sintaxa:

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

- Vertraulich / Confidential -
După sursele de date special au fost determinată și setată pentru obiectele din
pagina .aspx, trebuie să legați datele la aceste surse de date. UtilizațiPage.DataBind sau
metoda Control.DataBind a lega datele la surse de date.

Ambele metode funcționează la fel. Diferența principală este că toate sursele de date


sunt legate la comenzile server după metoda Page.DataBind este apelat.Datele nu este
redat la controlul până când apelați explicit fie DataBind metoda de control de server
Web sau până când 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 colecţii de generice (eng. generics) .NET Framework 2.0 Beta introduce
suport pentru generice în scopul facilitării „scrierii” de cod flexibil şi reutilizabil.

Acestea acţionează ca template-uri, permiţând claselor, structurilor, interfeţelor,


metodelor şi delegate-urilor să fie declarate şi definite cu specificarea parametrilor de tip
generic, specificarea exactă a tipului realizându-se la utilizarea genericului.

Diferite namespace-uri precum System.Collections.Generic furnizează clase şi metode


generice şi pentru colecţii de „tipuri tari” (eng. strongly typed collections).

System.Nullable<T> este reprezentarea generală pentru valori opţionale.

ex: ArrayList, List, Array

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.

- Vertraulich / Confidential -
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)

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?

- Vertraulich / Confidential -
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.

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 o


interfata la cealalta prin adaugarea unei interfete wrapper).

- Vertraulich / Confidential -
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).

"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

- Vertraulich / Confidential -
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
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#)

- Vertraulich / Confidential -
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
înregistrările din cealaltă tabelă.
         Equijoin – sunt legate două tabele cu ajutorul unei condiţii de egalitate
         NonEquijoin - în acest caz condiţia de join foloseşte alt operator decât
operatorul de egalitatea
         SelfJoin – este legată o tabelă cu ea însăşi, e folosită de obicei în conjuncţie cu
relaţiile recursive.
         OuterJoin – sunt o extensie a equijoinului, când pentru unele înregistrări dintr-
o tabelă nu există corespondent în cealaltă tabelă, şi dorim ca aceste înregistrări
fără corespondent să fie totuşi afişate.

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?

- Vertraulich / Confidential -
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?

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 -

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