Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Cateva cuvinte despre List – introducere in clasele generice

   Reamintesc problema din articolul despre ArrayList: cream o lista in care adaugam referinte catre obiecte iar pentru a le accesa trebuia sa convertim explicit la tipul obiectului, altfel primeam eroare la compilare, de tipul: “Cannot implicitly convert type ‘object’ to ‘ContExemplu.Cont’. An explicit conversion exists (are you missing a cast?)”.

   C# este un limbaj type-safe, lucru care permite ca unele eventualele erori sa fie returnate la compilare (acest lucru face ca programul sa fie stabil, in sensul ca mare parte dintre errorile datorate tipurilor de date folosite sunt detectate la compilare), si nu la executie (run-time).

   Am expus aceasta problema, pentru a intelege mai bine termenul de generic. Clasele sau functiile generice sunt cele care primesc ca parametru tipul datelor manipulate si sunt foarte folosite in implementarea colectiilor sau algoritmilor care actioneaza asupra unor tipuri variate de date.

   Notiunea de cod generic poate parea cunoscuta celor care programeaza in C++, doar ca implementarea si regulile de utilizare difera in .Net.

   Conceptul de generics a aparut in versiunea 2.0 a limbajului C#.

   Dupa cum se va observa in cazul clasei List, la declarare, clasele generice vor contine intre “<” “>” tipul parametrului.

    public class Exemplu<T>

Acum, putem construi o clasa pentru int si una pentru double, foarte simplu :

    Exemplu<int> ex = new Exemplu<int>();
    Exemplu<double> ex2 = new Exemplu<double>();

   Clasa List se gaseste in spatiul de nume System.Collections.Generic, astfel ca, inainte de a o folosi, vom adauga :

    using System.Collections.Generic;

   Folosind aceeasi clasa Cont din articolul ArrayList, construim o lista in care vom retine referinte catre obiecte de tip Cont.

    List<Cont> conturi = new List<Cont>();

   Lista conturi “va sti” exact ce tip de obiecte sa stocheze, astfel vom putea adauga un obiect de tip Cont si vom putea accesa metodele lui, astfel:

    Cont student = new Cont();
    conturi.Add(student);

    conturi[0].Depune(40);
    Console.WriteLine(conturi[0].Sold());

   Daca incercam sa adauga un o varabila de un alt tip in afara de cel specificat in “<>”, va aparea eroare de compilare:

   Argument ‘1’: cannot convert from ‘int’ to ‘List.Cont’ 

   Cu clasa List se pot face operatii asematoare cu cele din ArrayList (Add, Count, Remove, BinarySearch etc).

Proprietatile Count si Capacity

   Aceste proprietati furnizeaza informatii despre obiectul de tip List. Proprietatea Count, ca si in cazul ArrayList, identifica numarul de elemente existente in lista. Proprietatea Capacity arata cate elemente mai pot fi adaugate in lista fara ca aceasta sa fie redimensionata.

    List<int> lista = new List<int>(4);
    lista.Add(10);
    //va afisa 1
    Console.WriteLine(lista.Count);
    //va afisa 4
    Console.WriteLine(lista.Capacity);

   Evident, rezultatul returnat de proprietatea Capacity va fi intotdeauna mai mare decat cel returnat de proprietatea Count. In cazul in care se doreste eliminarea acestei diferente, se foloseste metoda TrimExcess().

    lista.TrimExcess();
    //sunt egale 
    Console.WriteLine(lista.Capacity);
    Console.WriteLine(lista.Count); 

Metoda Clear

   Metoda Clear va elimina toate elementele din List Conturi. Apelul acestei metode este similar cu atribuirea liste catre null sau cu instantierea unui nou obiect (= new List…) in locul celui ale carui componente le dorim sterse.

    //sterge elem din lista
    conturi.Clear();

Copierea unui vector intr-o lista

   Presupunem ca avem un vector si vrem sa construim o lista care sa contina elementele acestuia. Vom transmite vectorul ca parametru iar lista va copia elementele din el.

Exemplu:

    //creem un vector de int
    int[] vector = new int[] { 3, 4, 5, 6 };
    //copiem elementele vectorului in lista
    List<int> lista = new List<int>(vector);

    Console.WriteLine(lista.Count); 

O lista cu membri clasei se gaseste pe msdn.

   Notiunea de generic a fost adaugata in C# pentru evitarea conversiilor, type-safety, reducerea operatiilor de boxing. Codul generic aduce un plus de performanta si calitate programelor scrise in C#.

   In articolul urmator, vom prezenta o alta clasa, care lucreaza tot cu grupuri de obiecte, Dictionary, avand rolul principal de stabili o relatie intre o cheie si o valoare.

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*