Documente Academic
Documente Profesional
Documente Cultură
limbajului C#
Cuprins
• Entităţi sintactice de bază
• Instrucţiuni
• Directive preprocesor
• Directiva using
2
Entităţi sintactice de bază
Identificatori
– Sunt secvenţe de caractere folosite pentru
nume de constante, tipuri de date, variabile
sau funcţii
– Un identificator este compus dintr-un singur
cuvânt, format din caractere Unicode şi poate
începe numai cu o literă sau cu caracterul
underscore (_)
– Identificatorii trebuie să difere de cuvintele
cheie
3
Identificatori
4
Cuvinte cheie (keywords)
• Sunt secvenţe de caractere rezervate pentru
declaraţii de date şi pentru instrucţiuni
5
Literali
• Literali reali:
– se folosesc pentru valori de tipul float, double şi
decimal
– se poate folosi notaţia zecimală
(parte_întreagă.parte_fracţionară)
– sau cea ştiinţifică (cu exponent)
– sufixele permise sunt f, F, d, D, m, M (decimal-
reprezentarea cu 29 zecimale pentru calcule
financiare)
7
Literali
• Literali caractere:
– reprezintă un caracter Unicode
– posibilităţi:
• de obicei dintr-un caracter delimitat de apostrofuri (de
exemplu ‘x’)
• din secvenţe de evitare simple (\’, \n, \t, …), caz în care se
generează un caracter Unicode pe baza unui tabel de
corespondenţe
• secvenţe de evitare în hexazecimal (\x hex-digit), caz în care
caracterul este dat de corpul secvenţei
8
Literali
• Literalul null:
– are o singură valoare posibilă, null
9
Operatori
Categorie Operatori Asociativitate
Primari x.y, x?.y, f(x), a[x], a?[x], x++, x--, S->D
new, typeof, checked, unchecked
Unari +, -, !, ~, ++x, --x, (T)x D->S
Multiplicativi *, /, % S->D
Aditivi +, - S->D
Shiftare <<, >> S->D
Relaţionali şi de <, >, <=, >=, is, as S->D
testare a tipului
Egalitate ==, != S->D
Logici pe biţi &, ^, | S->D
Logici pe &&, || S->D
operand
Condiţionali x ?? y, ?: D->S
Atribuire =, *=, /=, %=, +=, -=, <<=, >>=, &=, D->S
^=, |=
10
Operatori
• typeof:
– are ca rezultat tipul operandului
• checked:
– are ca efect generarea unei excepţii
(OverflowException) dacă, în timpul execuţiei,
valoarea unei expresii de tip întreg depăşeşte
domeniul de valori al acelui tip
• unchecked:
– are ca efect invalidarea verificărilor aritmetice în
etapa de compilare (mai rar utilizat)
11
Operatori
• is:
– se foloseşte pentru a verifica, în timpul execuţiei,
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 foloseşte pentru a face conversii explicite între o
valoare şi un tip referinţă, însă fără a genera o
excepţie (aşa cum face operatorul cast, în cazul unor
situaţii anormale)
– utilizare: expresie as Tip
– rezultatul este valoarea convertită sau valoarea null în
caz de eşec 12
Operatori
• x ?? y (null coalescing)
– dacă x este nenul rezultatul este x, altfel rezultatul
este y
13
Operatori
• Tipul referinţă:
– corespunde unor tipuri cu funcţionalitate extinsă:
• clasă, tablou, delegări, interfeţe şi tipul string
• Tipul pointer:
– este utilizat numai pentru manipularea explicită a
memoriei în aşa numitele blocuri nesigure (unsafe
blocks)
17
Categorii de tipuri
• Categorii:
– tipuri valoare:
• întreg, real, decimal, char, bool
– tipuri referinţă:
• object, string
19
Tipurile întregi:
ushort 16 0 ÷ 65535
long System.Int64
int 32 -2147483648 ÷ 2147483647
byte System.Byte
uint 32 0 ÷ 4294967295
ushort System.UInt16
-9223372036854775808 ÷
long 64
9223372036854775807
uint System.UInt32
ulong 64 0 ÷ 18446744073709551615
ulong System.UInt64
20
Tipurile reale:
• corespund celor din C/C++ şi se bazează pe
formatul flotant IEEE 754
• valori particulare:
• +0, -0, +00, -00, NaN (Not a Number)
21
Tipurile reale
• Tipul decimal:
– se reprezintă pe 16 octeţi şi permite reprezentarea
unor valori cu până 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 foloseşte pentru calcule
financiare
– nu admite valorile particulare de la celelalte tipuri
22
• Tipul caracter (char)(System.Char):
– reprezintă un caracter Unicode
25
– operaţia inversă se numeşte “unboxing” şi implică
copierea unei valori dintr-un obiect box într-o locaţie
de memorie:
…
int i=23;
object ob = i; // boxing
int k = (int)ob; // unboxing
26
• Tipul DateTime:
– permite reprezentarea:
• datei (an, luna, zi)
• şi/sau timpului (secunde scurse de la ora 0 a zilei respective)
27
Variabile
• Fiecare variabilă are asociat un tip care
defineşte domeniul de valori pentru variabilă şi
operaţiile posibile asupra acesteia
• O variabilă poate fi una locală, un parametru
formal al unei metode, un element de tablou, un
câmp instanţă sau un câmp static
29
Variabile
30
Variabile
31
Variabile
32
Tablouri
• Un tablou este o listă de elemente de acelaşi tip
• Exemplu:
int [ ] tab = new int[10]; int [ ] tab; tab = new int [10];
tab[0] = 1;
tab[9] = 11;
• Tablourile regulate:
– reprezintă blocuri compacte cu mai multe dimensiuni,
numărul acestora fiind fix şi precizat în momentul
declarării:
float [, ,] cub = new float [3, 5, 7]; // un singur tablou
…
cub[1,1,1] = 10.10;
– fiecare vector care intră în componenţa 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
38
Tablouri multidimensionale
40
Tablouri multidimensionale
41
Clasa System.Array
• De fiecare dată când se crează un tablou se crează o nouă
clasă derivată din clasa Array definită în spaţiul de nume
System
• Ca urmare se moştenesc diverse proprietăţi şi metode, ce
pot fi utilizate cu noul tablou, cum ar fi:
– SetValue(valoare, index);
– GetValue(index);
– Nume_tablou.Length; // numărul de elemente
– Nume_tablou.Rank; // numărul de dimensiuni ale unui tablou
– GetLowerBound(int); // limita inferioară pe o dimensiune
– GetUpperBound(int); // limita superioară pe o dimensiune
– GetLength(int); // numărul de elemente pe o dimensiune
– Sort( ); // sortează elementele unui tablou unidim.
– Reverse( ); // permite inversarea ordinii într-un tablou
• Tablourile definite ca instanţe 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
• Exemplu:
enum Culori : byte{Red, Green=2, Blue};
• Instrucţiunea expresie:
[variabila =] expresie;
47
Instrucţiuni
• Instrucţiuni de selecţie
– Instrucţiunea if-else
if(expresie_booleană)
instrucţiune
[else
instrucţiune]
– Instrucţiunea switch
switch(expresie_switch)
{
[case expresie_const:
instrucţiune]
[default :
instrucţiune]
}
48
Instrucţiuni
49
Instrucţiuni
• Instrucţiuni de ciclare
– Instrucţiunea while
while(expresie booleană)
instrucţiune
– Instrucţiunea do-while
do
instrucţiune
while(expresie booleană);
– Instrucţiunea for
for([expresie_iniţializare]; [expresie_booleană]; [expresie_iterare])
instrucţiune
50
Instrucţiuni
51
Instrucţiuni
• Instrucţiunea foreach
foreach(tip_valoare in IEnumerable)
instrucţiune
52
Instrucţiuni
using System;
class ForEachLoop
{
public static void Main()
{
string[ ] names = {“Iuan", “Ghio", “Vasai", “Ghiran"};
53
Instrucţiuni
54
Instrucţiuni
55
Instrucţiuni
• Instrucţiuni de salt
– Asigură transferul controlului execuţiei programului în
altă parte
– Există restricţii în utilizarea acestor instrucţiuni în
interiorul unui bloc try-finally
56
Instrucţiuni
– Instrucţiunea goto:
goto instrucţiune_cu_eticheta;
goto eticheta_case;
• In prima variantă, această instrucţiune se foloseşte de obicei
pentru a transfera controlul în afara unui ciclu imbricat (din
interior spre exterior), dar nu se poate folosi pentru transferul
execuţiei în interiorul unui ciclu imbricat
– Instrucţiunea return: return [expresie];
• Determină ieşirea dintr-o metodă (funcţie)
• Dacă metoda returnează ceva este obligatorie prezenţa
expresiei, având tipul specificat în metodă.
– Instrucţiunea throw: throw expresie_excepţie;
• Instrucţiunea activează o excepţie pentru a indica o situaţie
anormală apărută în timpul execuţiei programului
57
Instrucţiuni
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++
• Facilităţi:
– definirea unor constante simbolice folosite la
compilarea condiţionată: #define, #undef
– compilarea condiţionată: #if, #elif, #else, #endif
– controlul numărului de linie în procesul de compilare
pentru afişarea erorilor şi avertismentelor: #line
– generarea unor mesaje de eroare sau avertizare:
#error, #warning
– marcarea explicită a unor zone din codul sursă:
#region, #endregion
61
Directiva using
62
Directiva using
63