Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

Tipuri referentiale si tipuri valorice

1.Metodele si variabilele se definesc doar in clase si structuri.


2.Variabilele statice sunt initializate in constructori declarati static (nu instantiaza obiecte, doar aloca
si initializeaza membrii statici)
3.Functiile statice pot fi apelate fara a declara obiecte ale clasei

Diferenta intre tipuri valorice (manipulate direct prin nume) si tipuri referentiale (alocate dinamic)
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace ConsoleApplication17
{
class Class1
{
public int Val=0;
}
struct Struct1
{
public int Val;
}
class Test
{
static void Main()
{
//tip valoric, manipulat prin nume
//stocat pe stiva
Struct1 tv1;
tv1.Val = 0;
//se face copierea continutului din membrul drept peste cel stang
Struct1 tv2 = tv1;
tv2.Val = 123;
//tip referential, manipulate prin referinta
//la fel ca un pointer, doar ca se derefera automat, referintele pot fi
definite nule si pot fi incarcate cu obiecte generate cu new sau referinte
//de obiecte deja existente
//tipurile referentiale pot fi instantiate numai cu new , sunt stocate
numai in heap
Class1 tr1 = new Class1();
//tr2 refera primul obiect ,orice modificare actioneaza asupra ambelor
obiecte, nu se face o copiere intre obiecte
Class1 tr2 = tr1;
tr2.Val = 123;

//tipul int are o metoda prin care se face conversia ToString()


string txt = 110.ToString();
//doua expresii de tip object sunt considerate egale daca ambele refera
aceleasi obiect, sau daca ambele sunt null

Console.WriteLine("Valoric: {0}, {1} ", tv1.Val, tv2.Val);


Console.WriteLine("Referential: {0}, {1} ", tr1.Val, tr2.Val);
Console.Read();
}
}
}

Siruri de caractere
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace ConsoleApplication17
{
class Test
{
static void Main()
{

\r =return
\n=newline

string s1 = "text";
string text = "linia 1 \r\n linia2";
string fis1="c:\\stud\\CS\\siruri\\fisier.txt";
//se foloseste @ ca o o prefixare pentru netratarea evenimentelor de escape
string fis2=@"c:\stud\CS\siruri\fisier.txt"; //copie la indigo

char c=s1[0];
s1+=text;
string x="sir", y="sir",z;
z=x;
if(x==y)
Console.WriteLine("Acelasi");
if(x==z)
Console.WriteLine("Acelasi");
Console.WriteLine(text);
Console.Read();
}
}
}

Definirea noilor tipuri valorice prin enum si struct


Definirea noilor tipuri referentiale prin class, interface si delegate

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace ConsoleApplication17
{

public enum Color


{
Rosu, Albastru, Verde
}
public struct Point
{
public int x, y;
}

public interface IBaza


{
void F();
}
public interface IDerivata : IBaza
{
void G();
}
public class A
{
protected virtual void H()
{
Console.WriteLine("A.H");
}
}
public class B : A, IDerivata
{
public void F()
{
Console.WriteLine("B.F, implementare IDerivata.F");
}
public void G()
{
Console.WriteLine("B.G, implementare IDerivata.G");
}
protected override void H()
{
Console.WriteLine("B.H, override pe A.H");
}
public delegate void DelegatVid();
//trecerea de la valoare in referinta si invers se face prin inpachetare si
despachetare (boxing, unboxing)
class Test
{
static void Main()
{
int i = 123;
object o = i; //boxing
int j = (int)o; //unboxing
//conversie in string
Console.WriteLine(3.ToString());
Console.Read();
}

}
}
}

Vectori si colectii

// tip[] nume pt vectori, dimensiunea se da la executie


using System;
class Test
{
static void Main(string[] args)
{
//masiv bidimensional
int[,] mb1 = new int[2, 3]; //alocare completa
mb1[1, 2] = 10;
int[,] mb2 = { { 10, 11 }, { 20, 21 }, { 30, 31 } }; //dimensiunile sunt
deduse din lista de initializatori

//declaratie cu dubla indexare, posibila doar in scara


//se precizeaza doar nr de linii, nu si dimensiunea lor
//aloca doar referintele de linie
int[][] ms1 = new int[3][];
ms1[0] = new int[3]; //alocare linie 1
ms1[1] = new int[7]; //alocare linie 2 cu alta dim
ms1[2] = new int[2];
//la copierea unui masiv se copiaza doar referinta nu si continutul
int[][] ms2 = new int[3][];
ms2[1] = new int[7];
Console.Write("\n" + ms2[1][3]);
ms2[1] = new int[7];
ms2 = ms1; //se copiaza referinte, nu elemente
ms1[1][3] = 13;
Console.Read();
}
}

Vectori de tipuri valorice


int vv=new int[4];

Vectori de obiecte
Persoana p1=new Persoana[4];

null

null

null

null

Persoana p1=new Persoana[4]{p1,p2,p3,p4}

p1

p2

p3

p4

Vectorii de tipuri valorice tin valori, adica numele vectorului este referinta.
Vectorii de obiecte tin referinte la obiecte, numele vectorului este referinta, iar la capatul referintei
sunt alte referinte.
// tip[] nume pt vectori, dimensiunea se da la executie
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

class Pers
{
public int Marca;
public string Nume;
//constructor cu parametru
public Pers(int m,string n)
{
Marca = m;
Nume = n;
}
}
class Test
{
static void Main(string[] args)
{
Pers p1,p2; //nu genereaza o instanta, doar se declara o referinta nula,
trebuie incarcata ulterior cu adresa unei
//instante deja existente
p1 = new Pers(1, "Unu");
p2 = p1;
//vector de persoane (vector de obiecte)
Pers[] vp; //nu instantiaza nimic
vp = new Pers[4]; //e instantiat
//in fiecare element avem o referinta => ii alocam memorie
int[] vi = { 1, 2, 3, 4 };
vp[0] = new Pers(0, "Zero");
vp[1] = p1;
Console.Write("{0}-{1} \n,\n", vp[1].Marca, vp[1].Nume);
vp[2] = new Pers(2, "Doi");
//parcurgere a vectorului
foreach (Pers crt in vp)
Console.Write("{0}-{1} \n", crt.Marca, crt.Nume);

Console.Read();
}
}

Colectii

Se aloca element cu element, sunt redimensionabile dinamic


Sunt de tip object

Tipuri de colectii:
1.
2.
3.
4.

ArrayList (lista) using System.Collections


SortedList (map)
Queue (coada)
Stack (stiva)

Pers.cs
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Colectii
{
class Pers
{
public int Marca;
public string Nume;
public Pers(int m, string n)
{
Marca = m;
Nume = n;
}
}
}

Pers
marca

nume

vector

Vect[0]

Vect[1]

Vect[2]

@Pers

@Pers

@Pers

using
using
using
using
using

System;
System.Collections;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Colectii
{
class Program
{
static void Main(string[] args)
{
//-----------------------------------------//
// Tipuri de COLECTII - Declarari
//
//-----------------------------------------//
ArrayList lista;
//lista cu val null
SortedList slista;
//map
Queue coada; //coada
Stack stiva; //stiva
//vector de persoane
Pers[] vect = new Pers[3];
vect[0] = new Pers(0, "Zero"); //se apeleaza constructorul din clasa Pers
si se asociaza marca si numele cu valorile impuse
vect[1] = new Pers(1, "Unu");
vect[2] = new Pers(2, "Doi");
lista = new ArrayList(); //initializare
//se foloseste metoda AddRange() pentru a popula o lista pornind de la un
vector
lista.AddRange(vect); //se adauga valorile vectorului de Persoane
//lista.Add(new Pers(0,"Zero"));
//lista.Add(new Pers(1, "Unu"));
//lista.Add(new Pers(2,"Doi"));
//adresare indexata
lista[1] = lista[2]; //refera aceeasi zona de memorie
vect[1] = vect[2];
//in cazul listelor e nevoie de operatorul cast
//modificare valori element 2 din lista
((Pers)lista[1]).Nume = "Nou";
vect[1].Nume = "Nou"; //la vectori nu este nevoie de conversie, pt ca
vectorul este deja de tip Pers
//parcurgem lista de persoane
foreach (Pers crt in lista)
Console.WriteLine("{0} - {1} \t", crt.Marca, crt.Nume);
Console.WriteLine("\n");
//parcurgem vectorul de persoane
foreach (Pers crt in vect)
Console.WriteLine("{0} - {1} \t", crt.Marca, crt.Nume);
Console.Read();
}
}
}

lista[1] = lista[2];

Valoare (nou)

lista[1].Nume = Nou

lista
lista[2].Nume = Nou
@
lista[0]
lista[1]
lista[2]

Proprietati (get, set)

Clasa Produs.cs
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Proprietati
{
class Produs
{
string den;
string um;
float pret;
int stoc;
public Produs()
{

stoc=0;
}
//proprietati pt atributul stoc
public int Stoc
{
get { return stoc; }
set { if(value > 0) stoc = value; }
}
}
}

using
using
using
using

System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Proprietati
{
class Program
{
static void Main(string[] args)
{
Produs p1 = new Produs();
p1.Stoc = 100; //se apeleaza proprietatea set
Console.WriteLine("\nStocul este " + p1.Stoc); //se apeleaza proprietatea
get pt afisarea stocului
}
}
}

Delegari si evenimente
Sa se defineasca si sa se utilizeze un delegat care sa permita gestionarea metodelor de vanzare si
cumparare, en gros si en detail, in cadrul unor activitati comerciale desfasurate de o firma.
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

In afara clasei pentru ca


este un tip

namespace Delegari
{
delegate void PersDelegat(Produs p, double suma);
class Produs
{
string
string
public
public

den;
um;
double pret;
int stoc;

public Produs()
{
stoc = 0;
pret = 1.0;
}
}
}

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Delegari
{
class ActivComerciale
{
public void cumpara_en_detail(Produs p, double suma)
{
p.stoc += (int)(suma / p.pret);
Console.WriteLine("\nCumpara en detail de " + suma + " lei");
}
public void cumpara_en_gros(Produs p, double suma)
{
p.stoc += (int)(suma / (p.pret * 0.9));
Console.WriteLine("\nCumpara en gros de " + suma + " lei");
}
public void vinde(Produs p, double suma)
{
p.stoc -= (int)(suma / p.pret);
Console.WriteLine("\nVinde in valoare de " + suma);
}
}

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Delegari
{
class Program
{
static void Main(string[] args)
{
Produs prod1 = new Produs();
ActivComerciale a = new ActivComerciale();
PersDelegat Popescu = new PersDelegat(a.cumpara_en_detail);
Popescu(prod1, 1000.0);
Console.WriteLine("\nStocul este " + prod1.stoc + " buc");
Popescu = new PersDelegat(a.cumpara_en_gros);
Popescu(prod1, 1000.0);
Console.WriteLine("\nStocul este " + prod1.stoc + " buc\n\n");
}
}
}

Interfete
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Interfete
{

interface IMiscare
{
void start();
void stop();
void inainte(int distanta, int viteza);
void inapoi(int distanta, int viteza);
bool stanga(int unghi);
bool dreapta(int unghi);
}
}

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Interfete
{
class Vehicul:IMiscare
{
string tip;
public void start()
{
Console.WriteLine("\nStart vehicul");
}
public void stop()
{
Console.WriteLine("\nStop vehicul");
}
public void inainte(int distanta, int viteza)
{
Console.WriteLine("\nVehicul {0} m inainte cu {1} km/h", distanta,
viteza);
}
public void inapoi(int distanta,
{
Console.WriteLine("\nVehicul
}
public bool stanga(int unghi)
{
Console.WriteLine("\nVehicul
return true;
}
public bool dreapta(int unghi)
{
Console.WriteLine("\nVehicul
return true;
}
}
}

using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;

int viteza)
{0} m inapoi cu {1} km/h", distanta, viteza);

stanga cu {0} grade", unghi);

dreapta cu {0} grade", unghi);

using System.Threading.Tasks;
namespace Interfete
{
class Program
{
static void Main(string[] args)
{
Vehicul v = new Vehicul();
v.start();
v.stanga(20);
v.inainte(10, 100);
v.stop();
Console.Read();
}
}
}

Structuri de date dinamice


using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Lista
{
class nod
{
object inf; //informatia utila din nod
public nod next; //adresa catre urmatorul nod
public nod(object k)
{

inf = k;
next = null;
}
public nod (object k, nod urm)
{
inf = k;
next = urm;
}
//proprietate pt a obtine/modifica informatia utila
public object informatia
{
get { return inf; }
set { inf = value; }
}
}
}

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Lista
{
class lista
{
//capul listei = referinta la primul element al listei
protected Lista.nod cap;
//NR DE NODURI din lista
protected uint nrn;
public lista()
{
cap = null;
nrn = 0;
}
public void Adaugare(object k)
{
if (cap == null)
cap = new Lista.nod(k);
else
{
Lista.nod aux = cap;
while (aux.next != null)
aux = aux.next;
aux.next = new Lista.nod(k);
}
nrn++;
}
public void Afisare()
{
Lista.nod aux = cap;
while(aux!=null)
{
Console.Write("

{0}

", aux.informatia);

aux = aux.next;
}
}
public uint NrNoduri
{
get { return nrn; }
}
}
}

using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace Lista
{
class Program
{
static void Main(string[] args)
{
Lista.lista l = new Lista.lista();
l.Adaugare(20);
l.Adaugare(90);
l.Adaugare(45);
l.Afisare();
}
}
}

You might also like