Sunteți pe pagina 1din 63

Elemente de baz ale

limbajului C#

Cuprins

Entiti sintactice de baz


Instruciuni
Directive preprocesor
Directiva using

Entiti sintactice de baz


Identificatori
Sunt secvene de caractere folosite pentru
nume de constante, tipuri de date, variabile
sau funcii
Un identificator este compus dintr-un singur
cuvnt, format din caractere Unicode i poate
ncepe numai cu o liter sau cu caracterul
underscore (_)
Identificatorii trebuie s difere de cuvintele
cheie
3

Identificatori
Dac, totui, este posibil ca un identificator s
coincid cu un cuvnt cheie (de exemplu din alt
limbaj) trebuie utilizat caracterul @ ca i prefix:
un astfel de identificator se numete identificator verbatim
caracterul @ nu face parte efectiv din identificator, astfel c,
n alte limbaje, identificatorul este vzut ca un identificator
normal

Identificatorii ce ncep cu secvene de dou caractere


underscore (__) se folosesc pentru implementarea
limbajului
ca urmare, nu pot fi folosii n programe

Cuvinte cheie (keywords)


Sunt secvene de caractere rezervate pentru
declaraii de date i pentru instruciuni
Nu pot fi folosite pentru identificatori (cu excepia
dat de caracterul @)
Toate cuvintele cheie folosesc litere mici
Limbajul C# face distincie ntre litere mici i
litere mari (este "case-sensitive")
5

Literali
Permit reprezentarea unor valori n program
Pot avea urmtoarele tipuri:

boolean,
ntreg,
real,
caracter,
ir,
null

Literali booleni: true, false


6

Literali

Literali ntregi:
numere ntregi, n baza 10 sau 16 (prefix 0x, 0X)
se pot folosi sufixele u,U (unsigned) sau l,L(long)

Literali reali:
se folosesc pentru valori de tipul float, double i
decimal
se poate folosi notaia zecimal
(parte_ntreag.parte_fracionar)
sau cea tiinific (cu exponent)
sufixele permise sunt f, F, d, D, m, M (decimalreprezentarea cu 29 zecimale pentru calcule
financiare)
7

Literali

Literali caractere:
reprezint un caracter Unicode
posibiliti:
de obicei dintr-un caracter delimitat de apostrofuri (de
exemplu x)
din secvene de evitare simple (\, \n, \t, ), caz n care se
genereaz un caracter Unicode pe baza unui tabel de
corespondene
secvene de evitare n hexazecimal (\x hex-digit), caz n care
caracterul este dat de corpul secvenei

Literali

Literali ir de caractere:
pot fi de dou tipuri, regulate i verbatim
un ir regulat de caractere const dintr-o secven
(posibil vid) de caractere delimitat de ghilimele
secvena poate include i secvene de evitare

un ir verbatim const din caracterul @ urmat de un


ir regulat (de exemplu @hello) i poate continua
pe mai multe linii

Literalul null:
are o singur valoare posibil, null
9

Operatori
Categorie
Primari
Unari
Multiplicativi
Aditivi
Shiftare
Relaionali i de
testare a tipului
Egalitate
Logici pe bii
Logici pe
operand
Condiionali
Atribuire

Operatori
Asociativitate
x.y, x?.y, f(x), a[x], a?[x], x++, x--,
S->D
new, typeof, checked, unchecked
+, -, !, ~, ++x, --x, (T)x
D->S
*, /, %
S->D
+, S->D
<<, >>
S->D
<, >, <=, >=, is, as
S->D
==, !=
&, ^, |
&&, ||

S->D
S->D
S->D

x ?? y, ?:
=, *=, /=, %=, +=, -=, <<=, >>=, &=,
^=, |=

D->S
D->S

10

Operatori

typeof:
are ca rezultat tipul operandului

checked:
are ca efect generarea unei excepii
(OverflowException) dac, n timpul execuiei,
valoarea unei expresii de tip ntreg depete
domeniul de valori al acelui tip

unchecked:
are ca efect invalidarea verificrilor aritmetice n
etapa de compilare (mai rar utilizat)

11

Operatori

is:
se folosete pentru a verifica, n timpul execuiei,
dac tipul unui obiect este compatibil cu un tip dat
utilizare: expresie is Tip
rezultatul este o valoare boolean (true sau false)
n evaluarea tipului expresiei se iau n considerare i
conversii, exclusiv cele definite de utilizator

as:
se folosete pentru a face conversii explicite ntre o
valoare i un tip referin, ns fr a genera o
excepie (aa cum face operatorul cast, n cazul unor
situaii anormale)
utilizare: expresie as Tip
rezultatul este valoarea convertit sau valoarea null n
caz de eec
12

Operatori

x?.y (null conditional)


dac x este nenul se acceseaz membrul y, altfel
rezultatul este valoarea null

a?[x] (null conditional)


dac a este nenul se face accesul pe baza indexului
x, altfel rezultatul este valoarea null

x ?? y (null coalescing)
dac x este nenul rezultatul este x, altfel rezultatul
este y

13

Operatori

Se remarc lipsa operatorului C++ delete,


pentru dealocarea obiectelor dinamice:
C# asigur managementul automat al memoriei:
obiectele dinamice (create cu operatorul new) sunt
automat distruse atunci cnd nu mai sunt referite
presupune cod suplimentar adugat de compilator:
care (se pare) nu influeneaz serios performanele
ns presupune i o degrevare a utilizatorului de
grija dealocrii obiectelor
presupune i alte manevre n memorie (mutarea
obiectelor) pentru crearea unor zone libere contigue
14

Tipuri
Un program C# const din:
crearea unor tipuri noi
utilizarea unor tipuri existente:
predefinite sau importate din alte biblioteci

Fiecare tip conine un set de date i funcii


(metode) membre, mpreun formnd module ce
sunt elementele de baz ale unui program C#
In general, pentru a utiliza un tip, trebuie create
instane ale acelui tip:
acei membri (date i funcii) care necesit instaniere
se numesc membri instan
acei membri care pot fi utilizai numai pe baza tipului
se numesc membri statici
15

Tipuri

Fiecare tip are un set propriu de reguli ce


definesc cum poate fi convertit acel tip ctre alt
tip sau invers

Conversiile ntre tipuri pot fi:


implicite (se fac automat)
explicite (operatorul de conversie explicit cast)

Conversiile implicite asigur c nu se pierd date


n cursul conversiei:
sunt permise conversii implicite de la un tip cu
domeniul mai mic ctre un tip cu domeniul mai mare
n caz contrar este necesar o conversie explicit 16

Categorii de tipuri
Tipul valoare:
corespunde tipurilor de baz:
tipurile simple (int, long, bool, etc.),
structuri i enumerri

Tipul referin:
corespunde unor tipuri cu funcionalitate extins:
clas, tablou, delegri, interfee i tipul string

Tipul pointer:
este utilizat numai pentru manipularea explicit a
memoriei n aa numitele blocuri nesigure (unsafe
blocks)

17

Categorii de tipuri

Principala deosebire ntre tipul valoare i tipul


referin const n modul n care acestea sunt
reprezentate n memorie
Pentru tipul valoare:
se pstreaz n memorie o valoare brut (numeric, caracter,
), valoare ce este depus, de obicei, pe stiv

Pentru tipul referin:


se stocheaz n memorie adresa unui obiect din memoria
heap
tipul referin poate avea valoarea null, caz n care nu
adreseaz nici un obiect
acest tip este creat folosind operatorul new, dar nu este
necesar utilizarea operatorului delete
18

Tipuri predefinite
Categorii:
tipuri valoare:
ntreg, real, decimal, char, bool

tipuri referin:
object, string

Aceste tipuri au i alte nume (alias) introduse n


spaiul de nume System

19

Tipurile ntregi:
Tip C#

Tip System

Tip

Nr. bii

Domeniu de valori

sbyte

System.Sbyte

sbyte

-128 127

short

System.Int16

byte

0 255

int

System.Int32

short

16

-32768 32767

long

System.Int64

ushort

16

0 65535

int

32

-2147483648 2147483647

uint

32

0 4294967295

long

64

-9223372036854775808
9223372036854775807

ulong

64

0 18446744073709551615

byte

ushort
uint
ulong

System.Byte

System.UInt16
System.UInt32
System.UInt64

20

Tipurile reale:
corespund celor din C/C++ i se bazeaz pe
formatul flotant IEEE 754
Tip C#

Tip System

float

System.Single

double

System.Double

decimal

System.Decimal

Tip
float
double
decimal

Nr.
bii

Precizie

Domeniu de
valori

7 cifre

1.5 x 10-45 3.4 x


1038

64

15-16 cifre

5.0 x 10-324 1.7 x


10308

128

28-29 poziii
zecimale

1.0 x 10-28 7.9 x


1028

32

valori particulare:
+0, -0, +00, -00, NaN (Not a Number)
21

Tipurile reale

Literalii flotani pot fi utilizai pentru iniializarea


tipurilor reale, att n forma zecimal ct i n
cea exponenial

Tipul decimal:
se reprezint pe 16 octei i permite reprezentarea
unor valori cu pn la 28 de cifre semnificative,
precum i a punctului zecimal
are un domeniu de valori mai mic dar o precizie mai
bun, motiv pentru care se folosete pentru calcule
financiare
nu admite valorile particulare de la celelalte tipuri
22

Tipul caracter (char)(System.Char):


reprezint un caracter Unicode

Tipul boolean (bool)(System.Boolean):


reprezint o valoare logic, creia i se pot atribui doar
literalii true sau false
nu sunt admise nici un fel de conversii de la acest tip
ctre un alt tip

Tipul string (System.String):


reprezint o secven de caractere Unicode
datorit utilizrii intense sunt permise construcii de
forma:
string s = abcd;
dei string este o clas

23

irurile nu mai pot fi modificate (imutable)


pot fi concatenate cu operatorul +
elementele din ir pot fi referite cu operatorul de
indexare [ ]
dei sunt tipuri referin, valorile irurilor pot fi
comparate cu operatorii == i !=
clasa String ofer multe faciliti utile pentru iruri:
Length
Concat( )

Lungimea irului de caractere


Metod static prin care se obine un ir nou, format
din dou sau mai multe iruri
CompareTo( ) Metod de comparare a irului dat cu un alt ir de
caractere
Format( )
Permite formatarea datelor
SubString( )
Metod de gsire a unui subir ntr-un ir dat
IndexOf( )
D poziia de la care ncepe un caracter sau ir ntrun alt ir
Insert( )
Returneaz un ir nou, ce conine inserat irul
24
specificat

Tipul obiect (object)(System.Object):


st la baza tipurilor valoare ct i a tipurilor referin
sistem unificat de tipuri (unified type system)
este posibil apelul unor metode i pentru tipul valoare:

int i=10;
Console.Write(i.ToString( ));

o variabil de tip valoare poate fi convertit ctre tipul


Object prin operaia numit boxing, operaie prin
care se aloc un obiect box n care se copiaz
valoarea variabilei

25

operaia invers se numete unboxing i implic


copierea unei valori dintr-un obiect box ntr-o locaie
de memorie:

int i=23;
object ob = i;
int k = (int)ob;

// boxing
// unboxing

aceast posibilitate de a trata tipurile valoare ca i


obiecte face legtura ntre tipul valoare i tipul
referin
n majoritatea limbajelor de programare, aceste tipuri sunt
tratate complet separat.
26

Tipul DateTime:
permite reprezentarea:
datei (an, luna, zi)
i/sau timpului (secunde scurse de la ora 0 a zilei respective)

o variabil de acest tip este iniializat implicit cu data


01/01/0001 i ora 0:00 AM

27

Variabile
Fiecare variabil are asociat un tip care
definete domeniul de valori pentru variabil i
operaiile posibile asupra acesteia
O variabil poate fi una local, un parametru
formal al unei metode, un element de tablou, un
cmp instan sau un cmp static
In limbajul C# nu exist declaraii globale
pentru variabile sau funcii !
comportamentul funciilor sau variabilelor globale
poate fi obinut cu ajutorul metodelor statice respectiv
variabilelor statice

28

Variabile

O variabil local este declarat n metode,


proprieti sau indexatori printr-o declaraie:
tip variabila [= expresie];
const tip variabila = expresie_constanta;

Domeniul unei variabile se ntinde din locul


declaraiei pn la sfritul blocului n care
apare declaraia
In blocul curent sau n alte blocuri imbricate
nu mai pot fi declarate alte variabile cu
acelai nume
29

Variabile

Variabilele introduse cu modificatorul const


trebuie obligatoriu iniializate la declarare, iar
orice tentative de a atribui valori acestor
variabile sunt considerate erori

Compilatorul evalueaz aceste variabile n etapa


de compilare i ca urmare se pot face optimizri
suplimentare dac se folosesc constante definite
anterior:
const double PI = 3.1415926;
const double PI2 = 2*PI;
30

Variabile

Limbajul C# este puternic tipizat:


operaiile posibile asupra unei variabile sunt forate n
etapa de compilare i nu la execuie

C# este un limbaj sigur din punctul de vedere al


tipului (type-safe):
asigur, prin verificri de tip n timpul execuiei, c
operaiile asupra unei variabile se fac numai prin tipul
adecvat de date

31

Variabile

O variabil trebuie iniializat nainte de utilizare


acest lucru se poate face prin atribuiri explicite
dar exist i iniializri implicite pentru cmpuri
instane, cmpuri statice sau elemente de tablou:
Tip
Numeric
Bool
Char
Enum
Reference

Valoare implicit
0
false
\0
0
null

32

Tablouri
Un tablou este o list de elemente de acelai tip
Tipul elementelor tabloului reprezint tipul
tabloului respectiv
Orice tablou are un nume

Ca i tipuri, tablourile sunt derivate din clasa


System.Array i se declar cu ajutorul
operatorului de indexare ([ ])
33

Tablouri unidimensionale
Elementele unui astfel de tablou sunt plasate
succesiv ntr-o zon contigu de memorie
Un tablou unidimensional se declar astfel:
Tip [ ] nume_tablou = new Tip [dimensiune]
[={expresii_de_initializare}];
Tip este un tip predefinit sau definit de utilizator
nume_tablou este un identificator C#
dimensiune este o expresie ntreag i pozitiv ce
specific numrul de elemente din tablou
34

Tablouri unidimensionale

Pentru referirea unui element se folosete


operatorul de indexare [ ], preciznd numele
tabloului i poziia elementului n tablou (indexul
sau indicele):
nume_tablou[index];

indexul este, n general, o expresie ntreag i


pozitiv
primul element are indexul 0, iar ultimul are indexul
(dimensiune-1)

Dimensiunea zonei de memorie care se aloc


tabloului:
dimens_memorie = sizeof(tip) * dimensiune
35

Tablouri unidimensionale

Exemplu:
int [ ] tab = new int[10]; int [ ] tab; tab = new int [10];
tab[0] = 1;
tab[9] = 11;

Pentru tablouri locale sau tablouri cmpuri, este


admis o form prescurtat a declaraiei de forma:
int [ ] tab = {1,2,3}; <=> int [ ] tab = new int [ ] {1,2,3};

Pentru un tablou creat nu se mai poate modifica


dimensiunea acestuia
Exist n schimb clasa System.Collection ce
implementeaz tablouri cu dimensiune variabil
36

Tablouri multidimensionale
Tipuri de tablouri multidimensionale:
regulate
neregulate (jagged) sau imbricate

Tablourile regulate:
reprezint blocuri compacte cu mai multe dimensiuni,
numrul acestora fiind fix i precizat n momentul
declarrii:
float [, ,] cub = new float [3, 5, 7]; // un singur tablou

cub[1,1,1] = 10.10;
fiecare vector care intr n componena tabloului are o
dimensiune fix i ca urmare, tabloul va avea o
dimensiune fix de 3*5*7 elemente de tipul ntreg
aceste tipuri de tablouri sunt similare celor din C/C++
37

Tablouri multidimensionale
Tablourile regulate ocup zone contigue n memoria
RAM a calculatorului

38

Tablouri multidimensionale

Tablouri neregulate (jagged):


se refer la tablouri de tablouri (elementele tabloului
sunt la rndul lor tablouri):
int [ ][ ] matrice = new int [4][ ];
for(int i=0; i<3; i++) {
matrice[i] = new int[5];
}
matrice[0][1] = 0;
matrice[1][1] = 5;

prima parte a declaraiei introduce tipul elementelor


tabloului i forma acestuia, pe cnd a doua parte
constituie expresia de creare i precizeaz
dimensiunea tabloului
n acest caz, fiecare vector ce formeaz tabloul poate
avea orice dimensiune
39

Tablouri multidimensionale
fiecare pereche de paranteze ptrate poate fi folosit
pentru a specifica un alt tablou (uni sau
multidimensional):
long[2][5] Distante;
long[2,4][5] Distante;
long[2,4][5,12,8] Distante;

prima dimensiune poate lipsi cnd se face iniializarea


la declarare:
string[ ][ ] Membri = new string[2][ ]{
new string[ ]{"SM1", "SM2", "SM3"},
new string[ ]{"SS1", "SS2", "SS3", "SS4"}
};

40

Tablouri multidimensionale
n cazul acestui tip de tablouri, alocarea memoriei
poate lua forme diverse
astfel putem avea mai multe linii ce pointeaz ctre
acelai vector, linii nealocate sau referine ncruciate

41

Clasa System.Array
De fiecare dat cnd se creaz un tablou se creaz o nou
clas derivat din clasa Array definit n spaiul de nume
System
Ca urmare se motenesc diverse proprieti i metode, ce
pot fi utilizate cu noul tablou, cum ar fi:

SetValue(valoare, index);
GetValue(index);
Nume_tablou.Length;
// numrul de elemente
Nume_tablou.Rank;
// numrul de dimensiuni ale unui tablou
GetLowerBound(int);
// limita inferioar pe o dimensiune
GetUpperBound(int);
// limita superioar pe o dimensiune
GetLength(int);
// numrul de elemente pe o dimensiune
Sort( );
// sorteaz elementele unui tablou unidim.
Reverse( );
// permite inversarea ordinii ntr-un tablou

Tablourile definite ca instane ale clasei System.Array au


dezavantajul c au dimensunea fix (odat declarat la
creare, aceast dimensiune nu mai poate fi modificat) 42

Clasa System.Array

Limbalul C# (prin intermediul CLR) asigur


verificri de domeniu de indici n timpul execuiei
unui program i genereaz excepia de tipul
IndexOutOfRangeException pentru indeci
invalizi
Tablourile au tipul referin, astfel c declaraia
unui tablou doar rezerv spaiu pentru adresa
ctre acel tablou i nu rezerv spaiu pentru
elementele tabloului
Elementele tabloului sunt efectiv create n urma
alocrii dinamice cu specificarea dimensiunii sau
cu iniializri
43

Enumerri
Enumerrile introduc un grup de constante cu
nume
Sintaxa declaraiei unei enumerri este
urmtoarea:
enum nume_enumerare [: tip_intreg]
{membri_enumerare [ = valoare]};

Dac nu se specific altceva, enumerrile sunt


de tip ntreg i membri acestora primesc valori
constante ntregi ncepnd cu valoarea 0,
continund cu 1,2,
Valoarea unui membru se determin prin
incrementarea valorii membrului precedent,
dac nu apare o iniializare explicit
44

Enumerri

Exemplu:
enum Culori : byte{Red, Green=2, Blue};

Membri unei enumerri se folosesc mpreun cu


numele enumerrii:
Culori clr = Culori.Red;

Tipul enum este derivat din clasa System.Enum


ce are mai multe metode statice care permit:
determinarea tipului unei enumerri
verificarea dac o anumit valoare este admis
iniializarea unei enumerri pornind de la un ir
constant
obinerea listei de valori din enumerare
conversii, etc.

45

Enumerri

Enumerrile suport anumii operatori:

relaionali:
aritmetici:
logici pe bii:
sizeof

==, !=, <, >, <=, >=


+, -, ++, -&, |, ^, ~

Compilatorul nu verific dac rezultatul este o


valoare valid din enumerare
Se pot face conversii explicite de forma:
enum <-> enum
tip ntreg <-> enum

Numai literalul numeric 0 este convertit implicit


n tipul enum
46

Instruciuni
Majoritatea instruciunilor din limbajul C# sunt
preluate din limbajele C/C++

Unele instruciuni sunt modificate altele sunt noi


Instruciunea expresie:
[variabila =] expresie;
caz particular, instruciunea vid: ;
un alt caz particular l constituie expresiile booleene:
instruciunile de decizie i cele ciclice folosesc expresii
booleene spre deosebire de limbajul C++ ce folosete
expresii ce sunt evaluate la o valoare ntreag
47

Instruciuni

Instruciuni de selecie
Instruciunea if-else
if(expresie_boolean)
instruciune
[else
instruciune]

Instruciunea switch
switch(expresie_switch)
{
[case expresie_const:
instruciune]
[default :
instruciune]
}
48

Instruciuni
Instruciunea switch poate evalua numai expresii ce
au un tip predefinit (tipuri ntregi, caracter sau ir) sau
tipul enum (C++ nu permite tipul enum)

Dup execuia unei instruciuni asociate unei etichete


case nu se termin execuia instruciunii switch
Ca urmare trebuie controlat fluxul execuiei prin
instruciuni de salt (break sau goto)

49

Instruciuni

Instruciuni de ciclare
Instruciunea while
while(expresie boolean)
instruciune

Instruciunea do-while
do
instruciune
while(expresie boolean);

Instruciunea for
for([expresie_iniializare]; [expresie_boolean]; [expresie_iterare])
instruciune

50

Instruciuni
De obicei, instruciunea for se folosete atunci cnd
se dorete controlul valorii unui iterator (variabil de
ciclare)

Prima instruciune, de regul, iniializeaz variabila


iterator, pe cnd ultima instruciune modific aceast
variabil (de obicei prin incrementare sau
decrementare)

51

Instruciuni

Instruciunea foreach
foreach(tip_valoare in IEnumerable)
instruciune
se folosete pentru colecii (inclusiv tablouri)
se execut instruciunea asociat pentru fiecare
element din colecie
elementele extrase din colecie nu pot fi ns
modificate
toate coleciile ncurajeaz acest tip de funcionalitate
prin implementarea tipului IEnumerable i
IEnumerator

52

Instruciuni
using System;
class ForEachLoop
{
public static void Main()
{
string[ ] names = {Iuan", Ghio", Vasai", Ghiran"};

foreach (string person in names)


{
Console.WriteLine("{0}", person);
}
}
}
53

Instruciuni
Spaiul de nume System.Collections conine mai multe
clase care servesc ca i containere pentru colecii de
date:
ArrayList
BitArray
Hashtable
Queue
SortedList
Stack

Tablou redimensionabil
Tablou de bii
Tablou de perechi cheie/valoare
Coada (FIFO)
Tablou de perechi cheie/valoare ordonate
Stiva (LIFO)

Tablourile de tipul ArrayList se pot folosi atunci cnd


dimensiunea tablourilor nu se cunoate n momentul
compilrii (ci va fi stabilit ulterior, la execuie sau la
runtime), sau este necesar redimensionarea acestora

54

Instruciuni
Clasa ArrayList pune la dispoziie mai multe metode i
proprieti utile pentru manevrarea unor astfel de colecii
de date:
Count

Proprietate care returneaz numrul de elemente


existente n tablou
Capacity Proprietate pentru citirea i setarea numrului de
elemente pe care l poate conine tabloul
Add( )
Metod public de adugare a unui element n tablou
Insert( ) Metod public de inserare a unui element n tablou
Sort( ) Metod public de sortare a elementelor unui tablou

55

Instruciuni

Instruciuni de salt
Asigur transferul controlului execuiei programului n
alt parte
Exist restricii n utilizarea acestor instruciuni n
interiorul unui bloc try-finally
Instruciunea break:

break;

Asigur ieirea necondiionat dintr-o instruciune ciclic sau


din instruciunea switch ce conine instruciunea break

Instruciunea continue:

continue;

Asigur saltul peste instruciunile urmtoare ale unei ciclu


(while, do-while, for, foreach) i foreaz nceputul unei noi
iteraii

56

Instruciuni
Instruciunea goto:
goto
instruciune_cu_eticheta;
goto
eticheta_case;
In prima variant, aceast instruciune se folosete de obicei
pentru a transfera controlul n afara unui ciclu imbricat (din
interior spre exterior), dar nu se poate folosi pentru transferul
execuiei n interiorul unui ciclu imbricat

Instruciunea return:

return [expresie];
Determin ieirea dintr-o metod (funcie)
Dac metoda returneaz ceva este obligatorie prezena
expresiei, avnd tipul specificat n metod.

Instruciunea throw:

throw expresie_excepie;
Instruciunea activeaz o excepie pentru a indica o situaie
anormal aprut n timpul execuiei programului
57

Instruciuni

Instruciunea lock:

lock (expresie)
instruciune
Permite obinerea unei excluziuni mutuale pentru un
anumit obiect, execut instruciunea asociat i apoi
elibereaz excluziunea
Aceast instruciune este o alt form prin care se
permite apelul metodelor Enter( ) i Exit( ) din clasa
Monitor

Instruciunea using: using (expresie_declaraie)


instruciune
Permite obinerea unor resurse, execuia unei
instruciuni i apoi eliberarea resurselor
O resurs poate fi o clas sau structur ce
implementeaz tipul System.IDisposable, tip ce
permite apelul metodei Dispose( ) pentru eliberarea
unei resurse

58

Instruciuni
Utilizarea acestei instruciuni este echivalent cu
utilizarea unui bloc try-finally:
using (R r1 = new R()) {
// cod
}

R r1 = new R();
try {
// cod
}
finally {
if (r1 != null)
(IDisposable)r1.Dispose();
}

59

Directive preprocesor
In limbajul C#, se utilizeaz termenul de
directive preprocesor pentru compatibilitatea
cu limbajele C/C++

In C# nu exist preprocesare ca etap separat


n procesul de pregtire a unui program
Directivele sunt prelucrate n faza de analiz
lexical din cadrul compilrii
Directivele preprocesor ncep ntotdeauna cu
caracterul #
60

Directive preprocesor

Faciliti:
definirea unor constante simbolice folosite la
compilarea condiionat: #define, #undef
compilarea condiionat: #if, #elif, #else, #endif
controlul numrului de linie n procesul de compilare
pentru afiarea erorilor i avertismentelor: #line
generarea unor mesaje de eroare sau avertizare:
#error, #warning
marcarea explicit a unor zone din codul surs:
#region, #endregion

Se observ lipsa directivei preprocesor C++


include. In C# nu exist fiiere antet !
aceasta este nlocuit de directiva using
61

Directiva using
Directiva using se utilizeaz n dou scopuri:
s permit folosirea unor tipuri din spaii de nume fr calificare
complet
pentru a crea un alias pentru un spaiu de nume

In prima situaie, forma este urmtoarea:


using namespace;
In a doua situaie, se folosete forma:
using alias = type|namespace;
unde alias este un identificator (nume utilizator) ce se va folosi
ulterior pentru a reprezenta un tip sau un spaiu de nume

62

Directiva using

Exist cteva caracteristici ale directivei using


de care trebuie s se in seama:
domeniul unei astfel de directive este fiierul n care
apare directiva
un alias se creaz pentru a califica mai uor un spaiu
de nume sau un tip existent
atunci cnd se utilizeaz o directiv using pentru a
folosi tipuri dintr-un spaiu de nume, trebuie tiut c
aceasta nu d acces la alte spaii de nume incluse n
primul spaiu de nume

63

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