Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
Write("{0} ", employee.ToString());
}
Console.Write("\n");
}
}
}
Wynik:
0 5 10 15 20
100 101 102 103 104
WSKAZÓWKA
Kod źródłowy poszczególnych ćwiczeń można pobrać z serwerów wy-
dawnictwa Helion, spod adresu ftp://ftp.helion.pl/przyklady/vc25za.zip.
Kod publikowany jest w postaci spakowanego archiwum. Rozpakowanie
archiwum zaowocuje utworzeniem szeregu katalogów odpowiadających
poszczególnym rozdziałom, a w nich podkatalogów o nazwach zgod-
nych z nazwami poszczególnych projektów. Na przykład kodu z listin-
gu 1.1 należy szukać w katalogu r1\CreateATypeSafeList.
Jak to działa?
Kod z listingu 1.1 utworzył dwie klasy: klasę Employee (pracownik) — kla-sę obiektów przechowywanych w kolekcji, oraz klasę Program tworzoną
przez kreator Visual Studio 2005. Do tego w programie wykorzystana zo-
stała klasa List z biblioteki klas .NET Framework Class Library.
Klasa Employee zawiera pojedyncze prywatne pole (empID), konstruktor
i metodę przesłaniającą metodę ToString i wyświetlającą ciąg zawiera-
jący wartość pola empID.
W klasie Program tworzony jest egzemplarz klasy List mający przecho-
wywać obiekty klasy Employee. Typem empList jest więc „kolekcja List
obiektów Employee”. Stąd deklaracja kolekcji:
List
W definicji List
Tworzenie typowanych list za pomocą kolekcji generycznych
25
Deklaracja empList tworzy (jak zwykle) referencję obiektu tworzonego na stercie słowem kluczowym new. Słowo kluczowe new należy uzupełnić wy-wołaniem konstruktora, co wygląda następująco:
new List
Takie wywołanie tworzy na stercie egzemplarz „kolekcji List obiektów
Employee”; cała instrukcja oznacza zaś utworzenie empList i przypisa-
nie do niego referencji nowego obiektu sterty:
List
WSKAZÓWKA
Całość działa dokładnie tak, jak w instrukcji:
Dog milo = new Dog();
tworzącej egzemplarz klasy Dog na stercie i przypisującej go do re-
ferencji do typu Dog o nazwie milo.
W kolejnej instrukcji następuje utworzenie drugiej kolekcji; tym razem jest to „kolekcja List wartości całkowitych”:
List
Od tego momentu można rozpocząć wypełnianie listy wartości całkowi-
tych wartościami całkowitymi, a listy elementów typu Employee obiektami klasy Employee. Po wypełnieniu list można w pętlach foreach przejrzeć listy, wyłuskać poszczególne elementy i wypisać ich wartości na konsoli:
foreach (Employee employee in empList)
{
Console.Write("{0} ", employee.ToString());
}
A co…
… kiedy do listy obiektów Employee dodana zostanie wartość całkowita?
Cóż, trzeba spróbować. Wystarczy usunąć znacznik komentarza z pre-
zentowanego poniżej wiersza z listingu 1.1 i spróbować ponownie skom-
pilować program:
empList.Add(i * 5);
Kompilator powinien zgłosić parę błędów:
26 Rozdział 1: C# 2.0
Error 1 The best overloaded method match for
'System.Collections.
Generic.List
invalid arguments
Error 2 Argument '1': cannot convert from 'int' to
'ListCollection.Employee'
Komunikaty opisujące te dwa błędy pozwalają stwierdzić, że nie można
dodawać elementu typu int do kolekcji obiektów typu Employee, bo pomię-
dzy tymi typami nie da się przeprowadzić niejawnej konwersji, nie za-
chodzi też relacja zawierania się jednego typu w drugim.
Co ważniejsze, kolizję typów wykrywa się już na etapie kompilacji, a nie W kolekcjach dopiero w czasie wykonania — a wiadomo, że błędy czasu wykonania typowanych można mają tendencję do ujawniania się nie na stanowiskach testowych, a na umieszczać elementy typów pochodnych
biurkach klientów!
wobec typu
… z innymi kolekcjami generycznymi; są jeszcze jakieś?
deklarowanego.
Kolekcja elementów
Owszem, w platformie .NET 2.0 dostępne są też inne kolekcje typowane, typu Employee może więc przechowywać
jak choćby Stack (stos) czy Queue (kolejka); do tego dochodzi interfejs również elementy ICollection.
typu Manager, o ile
Manager jest typem
Kolekcje te stosuje się tak samo, jak List
Employee.
Employee, należy w definicji klasy Stack zastąpić
T (Stack