Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Wstp do programowania
w jzyku C#
Autor: Adam Boduch
ISBN: 83-246-0523-1
Format: B5, stron: 392
Przykady na ftp: 1421 kB
Spis treci
Przedmowa ..................................................................................... 11
Rozdzia 1. Wprowadzenie ................................................................................ 13
Czym jest programowanie ..............................................................................................13
Mnogo jzykw programowania ...........................................................................14
Edytory kodu ............................................................................................................15
Kompilatory ..............................................................................................................15
Mity zwizane z programowaniem ...........................................................................16
Jzyki programowania ....................................................................................................17
Asembler ..................................................................................................................18
Fortran ......................................................................................................................19
C ...............................................................................................................................19
C++ ...........................................................................................................................19
Perl ...........................................................................................................................20
PHP ...........................................................................................................................20
Turbo Pascal .............................................................................................................20
Java ...........................................................................................................................21
Jzyk maszynowy ...........................................................................................................21
Dziaanie kompilatorw ..................................................................................................22
Tworzenie kodu rdowego ....................................................................................22
Prekompilacja ...........................................................................................................23
Kompilacja do kodu Asemblera ...............................................................................23
Optymalizacja kodu ..................................................................................................23
Asemblacja ...............................................................................................................23
Konsolidacja .............................................................................................................24
Jzyki interpretowane .....................................................................................................24
Jzyk C# .........................................................................................................................24
Instalacja rodowiska ......................................................................................................24
Jak si uczy ...................................................................................................................25
Nie ucz si na pami! ..............................................................................................25
Pocztkowe trudnoci ...............................................................................................25
Pomoc systemowa ....................................................................................................25
Praktyka ....................................................................................................................26
Pierwsza aplikacja ..........................................................................................................26
Kompilacja i uruchamianie .......................................................................................26
Komponenty .............................................................................................................28
Piszemy kod .............................................................................................................29
Zapisywanie projektu ...............................................................................................29
Podsumowanie ................................................................................................................30
Spis treci
5
Instrukcje warunkowe .....................................................................................................63
Instrukcja if ...............................................................................................................64
Sowo kluczowe else ................................................................................................68
Instrukcja else if .......................................................................................................69
Instrukcja switch .......................................................................................................70
Ptle ................................................................................................................................73
Ptla while ................................................................................................................73
Ptla do-while ...........................................................................................................75
Ptla for ....................................................................................................................76
Instrukcja break ........................................................................................................77
Instrukcja continue ...................................................................................................78
Operator warunkowy ................................................................................................79
Konwersja danych ..........................................................................................................80
Rzutowanie .....................................................................................................................81
Przykadowa aplikacja ....................................................................................................81
Dyrektywy preprocesora .................................................................................................83
Deklarowanie symboli ..............................................................................................84
Instrukcje warunkowe ...............................................................................................84
Bdy i ostrzeenia ...................................................................................................85
Podsumowanie ................................................................................................................86
Spis treci
Spis treci
9
Mechanizm refleksji .....................................................................................................298
Funkcja GetType ....................................................................................................299
Klasa System.Type .................................................................................................300
adowanie podzespou ...........................................................................................301
Przykad dziaania program Reflection ..............................................................301
Wasne atrybuty ......................................................................................................306
Aplikacje .NET Framework SDK .................................................................................311
Global Assembly Cache Tool .................................................................................311
WinCV ...................................................................................................................313
Narzdzie konfiguracji .NET Framework ...............................................................313
PEVerify narzdzie weryfikacji .........................................................................314
.NET a COM .................................................................................................................314
PInvoke .........................................................................................................................316
Uycie funkcji Win32 API .....................................................................................316
Uycie atrybutu DLLImport ...................................................................................318
Podsumowanie ..............................................................................................................319
10
10
Rozdzia 7.
Tablice i kolekcje
Omwilimy ju spor cz tego, co oferuje jzyk C#. Powiedzielimy sobie o najwaniejszym programowaniu obiektowym, ktre moe przysporzy najwicej kopotw pocztkujcemu programicie. Nie zaprezentowaem do tej pory bardzo wanego
elementu wielu jzykw programowania, a mianowicie obsugi tablic.
Jest to bardzo wygodna funkcja jzyka programowania; przekonasz si o tym podczas
pisania przykadowej aplikacji podsumowujcej dotychczasow wiedz o jzyku C#.
Bdzie to znana i lubiana gra kko i krzyyk. O tym jednak pod koniec tego rozdziau. Nie przeduajc, spiesz z wyjanieniem, czym s tablice
Czym s tablice
Wyobra sobie, e w swojej aplikacji musisz przechowa wiele zmiennych tego samego
typu. Dla przykadu, niech bd to dni tygodnia typu string. Proste? Owszem, wystarczy zadeklarowa siedem zmiennych typu string:
string pon, wt, r, czw, pt, so, nd;
Teraz wyobra sobie sytuacj, w ktrej musisz zadeklarowa 12 zmiennych oznaczajcych nazwy miesicy. Nieco uciliwe? Owszem. Do tego celu najlepiej uy tablic,
ktre su do grupowania wielu elementw tego samego typu. Osobicie z tablic korzystam bardzo czsto, jest to znakomity, czytelny sposb na przechowywanie duej
iloci danych.
Przejdmy jednak do rzeczy. W C# istnieje moliwo deklaracji zmiennej, ktra przechowywa bdzie wiele danych. Tak w skrcie i uproszczeniu moemy powiedzie
o tablicach.
(06-09-01)
171
172
Deklarowanie tablic
Tablice deklaruje si podobnie jak zwyke zmienne. Jedyn rnic jest zastosowanie
nawiasw kwadratowych:
typ[] Nazwa;
W miejsce typ naley poda typ danych elementw tablicowych (np. int, string),
a w miejsce nazwa nazw zmiennej tablicowej. Przykadowo:
int[] Foo;
W tym miejscu zadeklarowalimy tablic Foo, ktra moe przechowywa elementy typu
int. Przed uyciem takiej tablicy naley zadeklarowa, z ilu elementw ma si ona
skada. W tym celu korzystamy ze znanego nam operatora new:
Foo = new int[5];
=
=
=
=
=
100;
1000;
10000;
100000;
1000000;
Console.WriteLine(Foo[4]);
Moliwy jest rwnie skrtowy zapis deklaracji tablic, podobny do tego znanego
z tworzenia obiektw:
int[] Foo = new int[5];
Indeks
Tablica skada si z elementw. Kademu z nich przypisany jest tzw. indeks, dziki
ktremu odwoujemy si do konkretnego elementu tablicy. w indeks ma posta liczby
i wpisujemy go w nawiasach kwadratowych, tak jak to zaprezentowano w poprzednim
przykadzie. Spjrz na kolejny przykad:
char[] Foo = new char[5];
Foo[0]
Foo[1]
Foo[2]
Foo[3]
Foo[4]
172 (06-09-01)
=
=
=
=
=
'H';
'e';
'l';
'l';
'o';
173
Warto
Naley uwaa, aby nie odwoa si do elementu, ktry nie istnieje! Jeeli zadeklarowalimy tablic 5-elementow i odwoujemy si do szstego elementu (poprzez
indeks nr 5), kompilator C# nie zareaguje! Bd zostanie wywietlony dopiero po
uruchomieniu programu.
Inicjalizacja danych
Po utworzeniu tablicy kademu elementowi przypisywana jest domylna warto. Np.
w przypadku typu int jest to cyfra 0. Programista po zadeklarowaniu takiej tablicy ma
moliwo przypisania wartoci dla konkretnego elementu.
Istnieje moliwo przypisania wartoci dla konkretnego elementu ju przy deklarowaniu tablicy. Naley wwczas wypisa wartoci w klamrach:
char[] Foo = new char[5] {'H', 'e', 'l', 'l', 'o'};
Console.WriteLine(Foo[4]);
Kompilator oblicza rozmiar takiej tablicy po iloci elementw uporzdkowanych pomidzy klamrami.
Tablice wielowymiarowe
C# umoliwia take deklarowanie tzw. tablic wielowymiarowych. Przykadowo, poniszy kod tworzy tablic 72 (7 kolumn i 2 wiersze):
string[,] Foo = new string[7, 2];
(06-09-01)
173
174
0]
0]
0]
0]
0]
0]
0]
=
=
=
=
=
=
=
"Pn";
"Wt";
"r";
"Czw";
"Pt";
"So";
"Nd";
Foo[0,
Foo[1,
Foo[2,
Foo[3,
Foo[4,
Foo[5,
Foo[6,
1]
1]
1]
1]
1]
1]
1]
=
=
=
=
=
=
=
"Mon";
"Tue";
"Wed";
"Thu";
"Fri";
"Sat";
"Sun";
Jzyk C# nie ogranicza nas w iloci wymiarw. Moemy wic wprowadzi do naszej
tablicy kolejny wymiar. Poniszy fragment prezentuje deklaracj tablicy 242:
string[, ,] Foo = new string[2, 4, 2];
lub:
int[,] Foo = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
Ptla foreach
Podczas omawiania zagadnienia ptli nie wspomniaem o jednej wanej ptli sucej
do operowania na tablicach. Poniewa tematyka tablic w rozdziale 3. nie bya omawiania, pragn wspomnie o tej ptli wanie tutaj.
Ptla ta, znana programistom PHP, Perl czy te Delphi, dla .NET jako parametru wymaga tablicy. Spjrz na poniszy fragment kodu:
string[] Foo = new string[7];
Foo[0]
Foo[1]
Foo[2]
Foo[3]
Foo[4]
Foo[5]
Foo[6]
174 (06-09-01)
=
=
=
=
=
=
=
"Pn";
"Wt";
"r";
"Czw";
"Pt";
"So";
"Nd";
175
Przy prbie kompilacji wywietlony zostanie bd: A local variable named 'Bar'
cannot be declared in this scope because it would give a different meaning
to 'Bar', which is already used in a 'parent or current' scope to denote something else.
Identyczny rezultat jak ten pokazany przed chwil mona osign, stosujc ptl for:
for (int i = 0; i < Foo.Length; i++)
{
Console.WriteLine(Foo[i]);
}
(06-09-01)
175
176
0]
0]
0]
0]
0]
0]
0]
=
=
=
=
=
=
=
"Pn";
"Wt";
"r";
"Czw";
"Pt";
"So";
"Nd";
Foo[0,
Foo[1,
Foo[2,
Foo[3,
Foo[4,
Foo[5,
Foo[6,
1]
1]
1]
1]
1]
1]
1]
=
=
=
=
=
=
=
"Mon";
"Tue";
"Wed";
"Thu";
"Fri";
"Sat";
"Sun";
W przypadku tablic wielowymiarowych konstrukcja Tablica.Length zwraca liczb wszystkich elementw w tablicy. W prezentowanym przykadzie bdzie to 72,
czyli 14.
176 (06-09-01)
177
Tablice tablic
Mechanizm tablic jest w jzyku C# bardzo rozbudowany. Umoliwia nawet tworzenie
tablic, ktre zawieraj kolejne tablice. Poniszy kod prezentuje deklaracj takiej tablicy:
int[][] Foo = new int[2][];
Ten zapis oznacza, i tablica Foo zawiera bdzie kolejne dwie tablice o nieokrelonej
jeszcze liczbie elementw. Te dwie kolejne tablice rwnie musz zosta utworzone:
Foo[0] = new int[50];
Foo[1] = new int[1000];
Przypisywanie danych do takich tablic wyglda podobnie jak w przypadku tablic wielowymiarowych:
// przypisanie wartoci do elementu 26. tablicy nr 1
Foo[0][25] = 100;
// przypisanie wartoci do elementu 1000. tablicy drugiej
Foo[1][999] = 1;
Moim zdaniem przejrzystszy jest skrtowy zapis powyszego kodu, rwnie akceptowany przez kompilator C#:
int[][] Foo =
{
new int[] {1, 2},
new int[] {1, 2, 3}
};
Tablice struktur
O strukturach i wyliczeniach powiedzielimy sobie w rozdziale 5. W niektrych przypadkach przydatna okazuje si moliwo deklarowania tablic struktur lub typw wyliczeniowych. Jest to sprawa do prosta, jeeli znasz ju podstawy uycia tablic,
bowiem zamiast typu dotychczas uywanego (czyli int, string, char itp.) naley
uy wczeniej zadeklarowanej struktury:
(06-09-01)
177
178
178 (06-09-01)
179
if (args.Length == 0)
{
Console.WriteLine("Brak argumentw programu!");
return;
}
int[] ArrInt = new int[args.Length];
int count = 0;
foreach (string element in args)
{
ArrInt[count] = Int32.Parse(element);
++count;
}
Array.Sort(ArrInt);
for (int i = 0; i < ArrInt.Length; i++)
{
Console.WriteLine("{0} ", ArrInt[i]);
}
}
}
}
sLocation);
Klasa System.Array
Chyba oswoie si ju z myl, e cae rodowisko .NET oparte jest na klasach, strukturach i wyliczeniach? Nie inaczej jest w przypadku tablic. Kada tablica w jzyku C#
dziedziczy po klasie System.Array, ktra dostarcza podstawowych mechanizmw do
manipulacji na elementach tablicy. To dziki metodom tej klasy moemy pobra ilo
elementw w tablicy, posortowa j czy przeszuka. Kilka najbliszych stron zostanie
przeznaczonych na opisanie podstawowych elementw tej klasy.
(06-09-01)
179
180
Jeeli chodzi o waciwoci klasy, to najwaniejsz jest Length, ktra zwraca aktualn
liczb elementw tablicy. Ta sama klasa udostpnia rwnie waciwo LongLength,
ktra zwraca 64-bitow warto okrelajc rozmiar wszystkich elementw w przypadku tablic wielowymiarowych.
Warto rwnie wspomnie o waciwoci Rank, ktra zwraca liczb wymiarw danej
tablicy:
int[,] Foo = new int[3, 2] { { 1, 2 }, { 1, 2 }, { 1, 2 } };
Console.WriteLine(Foo.Rank);
Metody klasy
W trakcie omawiania klasy System.Array naley wspomnie o paru metodach, ktre
mog Ci si przyda przy okazji operowania na tablicach.
BinarySearch()
Uywajc algorytmu przeszukiwania binarnego, przegldam elementy tablicy, aby znale dan warto. Pierwszym parametrem tej metody musi by nazwa tablicy, na
ktrej bdzie ona operowa. Drugim parametrem szukany element. Oto przykad
uycia tej metody:
string[] Foo = new string[] { "Pn", "Wt", "r", "Czw", "Pt" };
Console.WriteLine(Array.BinarySearch(Foo, "r"));
Metoda zwraca numer indeksu, pod jakim znajduje si szukany element, lub 1, jeeli
nic nie zostao znalezione. W zaprezentowanym przykadzie metoda zwrci warto 2.
Clear()
Metoda umoliwia wyczyszczenie tablicy. W rzeczywistoci ustawia kademu elementowi warto 0 lub null w zalenoci od jego typu. Metoda przyjmuje trzy parametry.
Pierwszym jest nazwa tablicy, drugim numer indeksu, od ktrego ma rozpocz
czyszczenie, a trzecim zasig tego procesu. Dziki metodzie Clear() mona bowiem
wyczyci okrelone elementy z tablicy. Poniszy przykad prezentuje czyszczenie
caej zawartoci:
Array.Clear(Foo, 0, Foo.Length);
Metoda Clear() nie zmienia rozmiaru czyszczonej tablicy. Jeeli czycimy tablic,
ktra ma powiedzmy 5 elementw, to po przeprowadzeniu tej operacji nadal
bdzie ich miaa tyle samo.
180 (06-09-01)
181
Clone()
Metoda Clone() zwraca kopi tablicy, z ktrej zostaa wywoana np.:
Bar = Foo.Clone();
Od tej pory Bar bdzie posiadaa takie same elementy co Foo. Poniewa metoda Clone()
zwraca dane w postaci typu object, naley dokona rzutowania na waciwy typ. Tzn.
jeeli mamy tablic typu string, naley na niego dokona odpowiedniego rzutowania,
co prezentuje poniszy przykad:
string[] Foo = new string[] { "Pn", "Wt", "r", "Czw", "Pt" };
// tworzenie kopii
string[] Bar = (string[])Foo.Clone();
foreach (string element in Bar)
{
Console.WriteLine(element);
}
Copy()
By moe lepszym sposobem na utworzenie kopii tablicy bdzie zastosowanie metody
Copy(). Umoliwia ona dodatkowo okrelenie rozmiarw kopiowania, tj. ile elementw
zostanie skopiowanych. Oto przykad:
string[] Foo = new string[] { "Pn", "Wt", "r", "Czw", "Pt" };
string[] Bar = new string[Foo.Length];
// tworzenie kopii
Array.Copy(Foo, Bar, Foo.Length);
Find()
Metoda umoliwia przeszukanie caej tablicy w celu znalezienia danego elementu. Kwalifikacja danego elementu jako znaleziony lub te nie odbywa si przy pomocy zewntrznej metody. Oto przykadowy program:
{
Point[]
new
new
new
};
points = {
Point(10, 20),
Point(100, 200),
Point(400, 500)
(06-09-01)
181
182
Na samym pocztku zadeklarowaem tablic struktur Point, ktre bd przeszukiwane. Program wyszukuje elementw tablicy, w ktrej element X struktury Point jest
liczb parzyst. Po znalezieniu pierwszego metoda pointFind() zwraca true i koczy
swe dziaanie.
Struktura Point zadeklarowana jest w przestrzeni nazw System.Drawing. Nie zapomnij zadeklarowa jej uycia przy pomocy sowa using oraz doczy odpowiedniego
podzespou (System.Drawing.dll).
FindAll()
Jak sama nazwa wskazuje, metoda FindAll() wyszukuje wszystkie elementy, ktre
speniaj dane kryteria poszukiwa. Oto jak powinien wyglda program z poprzedniego
listingu, jeli ma wyszukiwa wszystkie elementy:
static void
{
Point[]
new
new
new
};
Main(string[] args)
points = {
Point(10, 20),
Point(100, 200),
Point(400, 500)
182 (06-09-01)
183
FindLast()
Metoda ta dziaa podobnie jak Find(). Jedyna rnica jest taka, e FindLast() szuka
ostatniego wystpienia danego elementu; nie koczy pracy, gdy znajdzie pierwszy
element pasujcy do kryteriw.
GetLength()
Zwraca ilo elementw w tablicy. Umoliwia dziaanie na tablicach wielowymiarowych.
W parametrze tej metody naley poda numer wymiaru, ktrego ilo elementw ma
by pobrana. Jeeli mamy do czynienia z tablic jednowymiarow, w parametrze wypisujemy cyfr 0.
Klasa System.Array udostpnia rwnie metod GetLongLength(), ktra dziaa analogicznie do GetLength(), z t rnic, i zwraca dane w postaci liczby typu long.
GetLowerBund(), GetUpperBund()
Metoda GetLowerBund() zwraca numer najmniejszego indeksu w tablicy. W przewaajcej czci przypadkw bdzie to po prostu cyfra 0. Metoda GetUpperBund() zwraca
natomiast najwikszy indeks danej tablicy. Obie metody mog dziaa na tablicach
wielowymiarowych; wwczas naley w parametrze poda indeks wymiaru. Przykadowe uycie:
int[] Foo = { 1, 2, 3, 4, 5, 6 };
Console.WriteLine("Najmniejszy indeks: {0}, najwikszy: {1}",
Foo.GetLowerBound(0), Foo.GetUpperBound(0));
GetValue()
Prawdopodobnie nie bdziesz zmuszony do czstego korzystania z tej metody, zwraca
ona bowiem warto danego elementu tablicy. W parametrze tej metody musisz poda
indeks elementu, tak wic jej dziaanie jest rwnoznaczne z konstrukcj:
Tablica[1];
(06-09-01)
183
184
Initialize()
We wczeniejszych fragmentach tego rozdziau pisaem o inicjalizacji tablicy. Metoda
Initialize() moe to uatwi. Jej uycie powoduje przypisanie kademu elementowi
pustej wartoci (czyli moe to by cyfra 0 lub np. warto null). Jej uycie jest bardzo
proste, nie wymaga podawania adnych argumentw:
Foo.Initialize();
IndexOf()
Przydatna metoda. Zwraca numer indeksu na podstawie podanej wartoci elementu.
Przykad uycia:
string[] Foo = { "Pn", "Wt", "r", "Czw", "Pt", "So", "Nd" };
Console.WriteLine(Array.IndexOf(Foo, "Pt"));
W powyszym przykadzie na konsoli zostanie wywietlona cyfra 4, gdy pod tym numerem kryje si element Pt.
Resize()
Metoda Resize() przydaje si wwczas, gdy musimy zmieni rozmiar danej tablicy.
W pierwszym jej parametrze musimy poda nazw tablicy poprzedzon sowem kluczowym ref oznaczajcym referencj. Drugim parametrem musi by nowy rozmiar tablicy:
string[] Foo = { "Pn", "Wt", "r", "Czw", "Pt", "So", "Nd" };
Array.Resize(ref Foo, Foo.Length + 5);
SetValue()
Metoda SetValue() umoliwia nadanie wartoci dla danego elementu tablicy. Prawdopodobnie nie bdziesz korzysta z niej zbyt czsto, gdy to samo dziaanie mona zrealizowa przy pomocy operatora przypisania. Gdyby jednak mia wtpliwoci, co do
jej uycia, poniej prezentuj przykad:
Foo.SetValue("Weekend", 9);
184 (06-09-01)
185
Sowo params, ktre poprzedza waciw deklaracj parametru, mwi o tym, i liczba
elementw przekazywanych do metody bdzie zmienna. Oto przykad takiego programu:
using System;
namespace FooApp
{
class Program
{
static void Foo(params string[] args)
{
for (int i = 0; i < args.Length; i++)
{
Console.Write(args[i] + " ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
Foo("Adam", "Paulina");
Foo("Adam", "Paulina", "Marta");
Console.Read();
}
}
}
Jak widzisz, moliwe jest przekazanie dowolnej liczby parametrw do metody Foo().
Kady parametr bdzie kolejnym elementem tablicy i jest to przydatna cecha jzyka C#.
Moliwe jest przekazywanie parametrw rnego typu. Nagwek metody musi wyglda wwczas tak:
static void Foo(params object[] args)
(06-09-01)
185