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: 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)); - 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 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 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 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? 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. - 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 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: 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 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?
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 (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() - 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. 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 - 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. 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
- 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. 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: /// /// destructor /// ~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. /// /// definitia pentru clasa Persoana care implementeaza interfata IDisposable /// 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"); - 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 (Persoana p = new Persoana("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 { 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"); } 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 (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 - 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 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. - Vertraulich / Confidential -
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 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 - 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 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) { 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 - 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 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;
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 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 { // 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 stringCollection = new SampleCollection(); // 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: using System.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 ThreadStart firstThreadStarg = new ThreadStart(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 Thread firsThread = new Thread(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: 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 { } 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 si IEnumerator . 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, a carei proprietate va returna un obiect de tip T. La fel si in cazul interfeteiIEnumerable, a carei metoda GetEnumerator va returna un Enumerator. Exista totusi diferente, intre cele doua. Una ar fi ca, interfata IEnumerator 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). - Vertraulich / Confidential -
//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; } //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(); - Vertraulich / Confidential -
//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); }
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 - 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 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 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. - 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 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 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:
- 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ă 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 este reprezentarea generală pentru valori opţionale. 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
o
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 î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.
- Vertraulich / Confidential -
OuterJoin – sunt o extensie a equijoinului, când pentru unele înregistrări dintro 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? 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 -