Summary

This document provides detailed explanations of data types in C#, including Value Semantics. It also includes examples of C# code demonstrating different data types.

Full Transcript

 Observaţie: Toate tipurile de date sunt derivate din tipul System.Object  Toate tipurile valoare sunt derivate din clasa System.ValueType, derivată la rândul ei din clasa Object (alias pentru System.Object).  Pentru tipurile valoare, declararea unei variabile implică şi alocarea de s...

 Observaţie: Toate tipurile de date sunt derivate din tipul System.Object  Toate tipurile valoare sunt derivate din clasa System.ValueType, derivată la rândul ei din clasa Object (alias pentru System.Object).  Pentru tipurile valoare, declararea unei variabile implică şi alocarea de spaţiu. Dacă iniţial, variabilele conţin valoarea implicită specifică tipului, la atribuire, se face o copie a datelor în variabila destinaţie care nu mai este legată de variabila iniţială. Acest proces se numeşte transmitere prin valoare, sau value semantics. Exemplul 19: using System; using System.Collections.Generic; using System.Text; namespace ExempluTipuriValoare { public struct Intreg { public int v; } class Program { static void Main(string[] args) { Intreg sa = new Intreg(); sa.v = 13; Intreg sb = sa; // se initializeaza prin copiere variabila sb Console.WriteLine("sa.v este {0}.", sa.v); Console.WriteLine("sb.v este {0} prin initializare.", sb.v); sa.v = 10; Console.WriteLine("sa.v este {0}.", sa.v); Console.WriteLine("sb.v este {0}.", sb.v); Console.ReadLine(); } } }  Spre deosebire de tipurile valoare, pentru tipurile referinţă, declararea unei variabile nu implică automat alocarea de spaţiu: iniţial, referin ele sunt null şi trebuie alocată explicit memorie pentru obiectele propriu-zise. În plus, la atribuire, este copiată referinţa în variabila 25 destinaţie, dar obiectul spre care indică rămâne acelaşi (aliasing). Aceste reguli poarta denumirea de reference semantics. Exemplul 20: Pentru exemplificarea celor de mai sus, pentru tipurile referinţă, vom folosi clasa StringBuilder. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ExempluTipuriReferinta { class Program { static void Main(string[] args) { StringBuilder a = new StringBuilder(); StringBuilder b = a; a.Append("Salut"); Console.WriteLine("a este '{0}'.", a); Console.WriteLine("b este '{0}' prin initializare.", b); a = null; Console.WriteLine("a este '{0}' prin atribuirea unei noi valori.", a); Console.WriteLine("b este '{0}'.", b); Console.ReadLine(); } } } I.2.5.1. Tipul valoare I.2.5.1.1. Tipuri predefinite Limbajul C# conţine un set de tipuri predefinite (int, bool etc.) şi permite definirea unor tipuri proprii (enum, struct, class etc.). 26 Tipuri simple predefinite Tip Descriere Alias pentru tipul struct din spaţiul de nume System object rădăcina oricărui tip string secvenţă de caractere Unicode System.String sbyte tip întreg cu semn, pe 8 biţi System.Sbyte short tip întreg cu semn, pe 16 biţi System.Int16 int tip întreg cu semn pe, 32 biţi System.Int32 long tip întreg cu semn, pe 64 de biţi System.Int64 byte tip întreg fără semn, pe 8 biţi System.Byte ushort tip întreg fără semn, pe 16 biţi System.Int16 uint tip întreg fără semn, pe 32 biţi System.Uint32 ulong tip întreg fără semn, pe 64 biţi System.Uint64 float tip cu virgulă mobilă, simplă precizie, pe 32 biţi System.Single (8 pentru exponent, 24 pentru mantisă) double tip cu virgulă mobilă, dublă precizie, pe 64 biţi System.Double (11 pentru exponent, 53 pentru mantisă) bool tip boolean System.Boolean char tip caracter din setul Unicode, pe 16 biţi System.Char decimal tip zecimal, pe 128 biţi (96 pentru mantisă), 28 System.Decimal de cifre semnificative Domeniul de valori pentru tipurile numerice: Tip Domeniul de valori sbyte -128; 127 short -32768; 32767 int -2147483648; 2147483647 long -9223372036854775808; 9223372036854775807 byte 0; 255 ushort 0; 65535 uint 0; 4294967295 ulong 0; 18446744073709551615 float -3.402823E+38; 3.402823E+38 double -1.79769313486232E+308; 1.79769313486232E+308 decimal -79228162514264337593543950335; 79228162514264337593543950335 O valoare se asignează după următoarele reguli: Sufix Tip nu are int, uint, long, ulong u, U uint, ulong L, L long, ulong ul, lu, Ul, lU, UL, LU, Lu ulong 27 Exemplul 21: string s = “Salut!” float g = 1.234F; long a = 10; double h = 1.234; long b = 13L; double i = 1.234D; ulong c = 12; bool cond1 = true; ulong d = 15U; bool cond2 = false; ulong e = 16L; decimal j = 1.234M; ulong f = 17UL; I.2.5.1.2. Tipul enumerare Tipul enumerare, asemănător cu cel din C++, se defineşte de către utilizator. Acest tip permite utilizarea numelor care, sunt asociate unor valori numerice.  Enumerările nu pot fi declarate abstracte şi nu pot fi derivate. Orice enum este derivat automat din clasa System.Enum, derivată din System.ValueType. În cazul în care nu se specifică tipul enumerării, acesta este considerat implicit int. Specificarea tipului se face după numele enumerării: [atribute][modificatori]enum NumeEnumerare [: Tip] { lista } În ceea ce urmează, vom considera enum fără elementele opţionale. Folosirea tipului enumerare impune următoarele observaţii:  în mod implicit, valoarea primului membru al enumerării este 0, iar fiecare variabilă care urmează are valoarea (implicită) mai mare cu o unitate decât precedenta.  valorile folosite pentru iniţializări trebuie să facă parte din domeniul de valori al tipului enum  nu se admit referinţe circulare enum ValoriCirculare { a = b, b } În acest exemplu, a depinde explicit de b, iar b depinde de a implicit Asemănător celor cunoscute din C++, tipul structură poate să conţină declaraţii de constante, câmpuri, metode, proprietăţi, indexatori, operatori, constructori sau tipuri imbricate. 28 Exemplul 22: using System; namespace tipulEnum {class Program { enum lunaAnului { Ianuarie = 1, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie } static void Main(string[] args) { Console.WriteLine("Luna Mai este a {0}",(int)lunaAnului.Mai + " luna din an."); Console.ReadLine(); } } } I.2.5.1.3. Tipuri nulabile Tipurile nulabile, nullable, sunt tipuri valoare pentru care se pot memora valori posibile din aria tipurilor de bază, eventual şi valoarea null. Am văzut mai sus că pentru tipurile valoare, la declararea unei variabile, aceasta conţine valoarea implicită a tipului. Sunt cazuri în care se doreşte ca, la declarare, valoarea implicită a variabilei să fie nedefinită. În C# există o astfel de posibilitate, folosind structura System.Nullable. Concret, o declaraţie de forma: System.Nullable var; este echivalentă cu T? var; unde T este un tip valoare. 29 Aceste tipuri nulabile conţin două proprietăţi:  proprietate HasValue, care indică dacă valoarea internă este diferită sau nu de null  proprietatea Value, care va conţine valoarea propriu zisă.  Legat de această noţiune, s-a mai introdus operatorul binar ?? a ?? b cu semnificaţia: dacă a este null b este evaluat şi constituie rezultatul expresiei, altfel rezultatul este a. I.2.6. Instrucţiuni condiţionale, de iteraţie şi de control Ne referim aici la instrucţiunile construite folosind cuvintele cheie: if, else, do, while, switch, case, default, for, foreach, in, break, continue, goto. I.2.6.1. Instrucţiunea if Instrucţiunea if are sintaxa: if (conditie) Instructiuni_A; else Instructiuni_B; Exemplul 23: Citindu-se două numere întregi, să se decidă care dintre ele este mai mare using System; namespace Exemplul_23 { class Program { static void Main(string[] args) { int a, b; string rezultat; Console.Write("Dati primul numar intreg : "); a = Convert.ToInt32(Console.ReadLine()); Console.Write("Dati al doilea numar intreg : "); b = Convert.ToInt32(Console.ReadLine()); if (a > b) rezultat = "primul este mai mare"; else if (a < b) rezultat = "primul este mai mic"; else rezultat = "numere egale"; Console.WriteLine("Rezultatul comparatiei lui {0} cu {1} este \"{2}\"", a, b, rezultat); } } } 30 Exemplul 24: Să se verifice dacă 3 puncte din plan M1, M2 şi M3, date prin coordonatele lor întregi, sunt coliniare. Punctele M1(x1,y1), M2(x2,y2), M3(x3,y3) sunt coliniare x1 y1 1  x2 y2 1 = 0 x3 y3 1  E=(x2-x1)(y3-y1)-(x3-x1)(y2-y1)=0 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Exemplul_24 { class Program { static void Main(string[] args) { double x1, y1, x2, y2, x3, y3; Console.WriteLine("Coordonatele primului punct:"); Console.Write("Abscisa : "); x1 = Convert.ToDouble(System.Console.ReadLine()); Console.Write("Ordonata : "); y1 = Convert.ToDouble(System.Console.ReadLine()); Console.WriteLine("Coordonatele celui de-al doilea punct:"); Console.Write("Abscisa : "); x2 = Convert.ToDouble(System.Console.ReadLine()); Console.Write("Ordonata : "); y2 = Convert.ToDouble(System.Console.ReadLine()); Console.WriteLine("Coordonatele celui de-al treilea punct:"); Console.Write("Abscisa : "); x3 = Convert.ToDouble(System.Console.ReadLine()); Console.Write("Ordonata : "); y3 = Convert.ToDouble(System.Console.ReadLine()); double E = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1); if (E == 0) Console.WriteLine("Puncte coliniare"); else Console.WriteLine("Puncte necoliniare"); } } } 31 Exemplul 25: Să se verifice dacă un număr întreg x este într-un interval dat [a, b] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Exemplul_25 { class Program { static void Main(string[] args) { int a, b, x; Console.WriteLine("Se citesc doua numere care vor reprezenta capetele intervalului"); Console.Write("Dati prima valoare : "); a = Convert.ToInt32(Console.ReadLine()); Console.Write("Dati a doua valoare : "); b = Convert.ToInt32(Console.ReadLine()); if (a > b) { x = a; a = b; b = x; } // interschimbarea valorilor pentru a avea intervalul [a, b] Console.Write("x = "); x = Convert.ToInt32(Console.ReadLine()); if (x >= a && x

Use Quizgecko on...
Browser
Browser