Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
C#. Programowanie
Autor: Jesse Liberty
Tumaczenie: Tomasz Walczak
ISBN: 83-246-0213-5
Tytu oryginau: Programming C#
Format: B5, stron: 600
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Przedmowa .................................................................................................................... 9
Cz I
Jzyk C#
17
19
.NET Framework
20
22
Jzyk C#
22
25
31
36
39
Zmienne i stae
43
Wyraenia
50
Odstpy
51
Instrukcje
51
Operatory
65
Dyrektywy preprocesora
73
78
Tworzenie obiektw
82
88
Usuwanie obiektw
92
Przekazywanie parametrw
95
101
103
107
109
Dziedziczenie
111
Polimorfizm
112
Klasy abstrakcyjne
118
122
124
Zagniedanie klas
126
129
130
130
Pary logiczne
130
Operator rwnoci
131
Operatory konwersji
131
7. Struktury......................................................................................................................137
Definiowanie struktur
137
Tworzenie struktur
140
146
154
160
164
Tablice
173
Instrukcja foreach
178
Mechanizm indeksowania
191
Interfejsy kolekcji
199
Ograniczenia
202
Klasa List<T>
207
Kolejki
217
Spis treci
Stosy
219
Sowniki
221
225
Wyraenia regularne
239
252
261
Wasne wyjtki
263
266
272
Delegaty zbiorowe
281
Zdarzenia
285
296
297
Cz II Programowanie w jzyku C#
305
308
313
334
337
341
Uywanie ADO.NET
343
345
347
356
360
Dodawanie kontrolek
363
Spis treci
Wizanie danych
366
375
375
376
Tworzenie porednika
380
387
387
Wywietlanie informacji
396
404
409
411
Metadane
411
Granice zabezpiecze
412
Manifesty
412
Podzespoy wielomoduowe
413
Podzespoy prywatne
421
Podzespoy wspdzielone
421
427
Mechanizm refleksji
433
444
Kontekst
453
455
Wtki
466
Synchronizacja
473
483
Spis treci
485
495
502
506
Strumienie w internecie
523
Serializacja
525
Izolowana pami
533
537
544
552
P/Invoke
555
Wskaniki
557
Dodatki
563
Spis treci
ROZDZIA 2.
Zgodnie z niepisan tradycj wiele ksiek programistycznych rozpoczyna si od opisu programu wywietlajcego napis Witaj wiecie. W tym rozdziale opisuj, jak stworzy, skompilowa i uruchomi prosty program napisany w jzyku C#. Analiza tego programu pozwoli
zaprezentowa kluczowe cechy jzyka C#.
Kod na listingu 2.1 zawiera podstawowe elementy bardzo prostego programu w jzyku C#.
Listing 2.1. Prosty program w jzyku C#
class Hello
{
static void Main()
{
// Uywa konsoli systemowej
System.Console.WriteLine("Witaj wiecie");
}
}
25
W programie wywietlajcym napis Witaj wiecie znajduje si deklaracja tylko jednego typu klasa Hello. Aby zdefiniowa typ w jzyku C#, wystarczy zadeklarowa go jako klas
za pomoc sowa kluczowego class, nada mu nazw w tym przypadku Hello i zdefiniowa potrzebne waciwoci i zachowanie. Waciwoci i zachowanie klasy w jzyku C#
musz znajdowa si wewntrz nawiasw ({}).
Dla programistw jzyka C++. Po zamykajcym nawiasie klasy nie ma rednika.
Metody
Do cech klasy nale waciwoci i zachowanie. Zachowanie zdefiniowane jest za pomoc
metod skadowych. Waciwoci opisuj w rozdziale 3.
Metoda to funkcja naleca do klasy. Metody skadowe s nawet czasem nazywane funkcjami
skadowymi. Metody definiuj, co klasa moe zrobi i jak si zachowuje. Zwykle nazwy metod
odzwierciedlaj ich dziaanie, na przykad WriteLine() lub AddNumbers(). Jednak w tym
przypadku metoda klasy ma specjaln nazw, Main(), ktra nie opisuje dziaania, ale informuje rodowisko CLR, e jest to gwna metoda klasy.
Dla programistw jzyka C++. Nazwa Main() w jzyku C# jest pisana wielk liter
i musi by skadow klasy (nie moe by globalna). Metoda Main() moe zwraca
typ int lub void.
Aby zadeklarowa metod, naley okreli zwracany przez ni typ oraz poda jej nazw. Deklaracje metod wymagaj take nawiasw, niezalenie od tego, czy metoda przyjmuje parametry. Na przykad wyraenie:
int myMethod(int size)
to deklaracja metody o nazwie myMethod, ktra przyjmuje jeden parametr liczb cakowit,
ktra w metodzie jest dostpna jako size. Metoda zwraca liczb cakowit. Typ zwracanej
wartoci informuje uytkownika, jaki typ danych zwraca metoda po zakoczeniu dziaania.
1
Teoretycznie moliwe jest umieszczenie w programie w jzyku C# wielu metod Main(). W takim przypadku
naley uy opcji /main wiersza polece i wybra, ktra klasa zawierajca metod Main() powinna suy
jako punkt startowy.
26
Niektre metody nie zwracaj adnej wartoci. Mwi si, e zwracaj typ void, okrelany
przez specjalne sowo kluczowe. Na przykad:
void myVoidMethod();
to deklaracja metody zwracajcej typ void i nieprzyjmujcej parametrw. W jzyku C# zawsze trzeba pamita o okrelaniu zwracanego typu, nawet jeli jest to void.
Komentarze
W programach C# mog si znajdowa komentarze. Na listingu 2.1 w pierwszym wierszu po
pocztkowym nawiasie metody Main() znajduje si komentarz:
// Uywa konsoli systemowej
Tekst rozpoczyna si od dwch ukonikw (//). Oznaczaj one komentarz. Komentarz to notatka wpisana przez programist, ktra nie wpywa na dziaanie programu. W jzyku C# mona uywa trzech rodzajw komentarzy.
Pierwszy rodzaj, przedstawiony powyej, oznacza, e cay tekst od symboli (//) do koca
wiersza jest traktowany jako komentarz. Jest to komentarz w stylu jzyka C++.
Drugi rodzaj komentarzy, nazywany komentarzem w stylu jzyka C, rozpoczyna si od symboli (/*) i koczy par znakw (*/). Pozwala to na dodania komentarza cigncego si przez
kilka wierszy bez koniecznoci wpisywania w kadym wierszu symboli (//). Przykad zastosowania tego rodzaju komentarzy znajduje si na listingu 2.2.
Listing 2.2. Przykad zastosowania komentarzy w stylu jzyka C
namespace HalloWorld
{
class HelloWorld
{
static void Main()
{
/* Uywa konsoli systemowej,
jak jest to wyjanione w tekcie */
System.Console.WriteLine("Witaj wiecie");
}
}
}
Cho zagniedanie komentarzy jzyka C++ nie jest moliwe, mona zagnieda komentarze w stylu jzyka C++ w komentarzach w stylu jzyka C. Dlatego zwykle uywa si komentarzy w stylu jzyka C++, a komentarze w stylu jzyka C su gwnie do wykomentowania blokw kodu.
Trzeci i ostatni rodzaj komentarzy obsugiwanych w jzyku C# suy do powizania z kodem
zewntrznej dokumentacji opartej na XML, co opisuj w rozdziale 13.
Aplikacje konsolowe
Witaj wiecie to przykad programu konsolowego. Aplikacja konsolowa zwykle nie ma graficznego interfejsu uytkownika (ang. graphical user interface GUI). Nie ma tam list rozwijanych, przyciskw ani okien. Dane wejciowe i wyjciowe przekazywane s przez standardow konsol zwykle jest to wiersz polece systemu. Ograniczenie si na tym etapie ksiki
Klasy, obiekty i typy
27
do aplikacji konsolowych pozwala uproci przykady i uatwia przedstawienie podstawowych waciwoci jzyka. W kolejnych rozdziaach czciej wystpuj aplikacje okienkowe
i internetowe, przy okazji ktrych przedstawiam narzdzia rodowiska Visual Studio .NET
suce do projektowania GUI.
Metoda Main() w prostym przykadzie przedstawionym na listingu 2.1 przekazuje tekst Witaj
wiecie do standardowego urzdzenia wyjcia, ktrym najczciej jest okno konsoli. Standardowym urzdzeniem wyjcia zarzdza obiekt zwany Console. Jedna z metod tego obiektu nazywa si WriteLine(). Przyjmuje ona jako parametr acuch znakw, ktry nastpnie wywietla w standardowym urzdzeniu wyjcia. Kiedy program zostanie uruchomiony, na ekranie
monitora pojawi si okno konsoli wiersza polece lub okno DOS-a z napisem Witaj wiecie.
Metody wywoywane s za pomoc operatora kropki (.). Dlatego aby wywoa metod WriteLine() obiektu Console, naley napisa Console.WriteLine(), podajc w miejscu trzech
kropek tekst, ktry ma zosta wywietlony.
Przestrzenie nazw
Console to tylko jeden z wielu uytecznych typw wchodzcych w skad biblioteki klas platformy .NET. Kada klasa nazywa si inaczej, dlatego FCL zawiera tysice nazw, jak ArrayList, Hashtable, FileDialog, DataException czy EventArgs. Istniej setki, tysice, a moe
Powoduje to pewne problemy. aden programista nie jest w stanie zapamita wszystkich
nazw uywanych przez platform .NET, a wczeniej czy pniej moe zdarzy si, e programista stworzy obiekt i uyje dla niego nazwy, ktra jest ju wykorzystywana przez inn
jednostk. Co si stanie, kiedy programista kupi klas Hashtable i odkryje, e powoduje ona
konflikt nazw z klas Hashtable udostpnian przez .NET? Naley pamita, e kada klasa
w jzyku C# musi mie niepowtarzaln nazw, a zwykle nie jest moliwa zmiana nazw w zakupionym kodzie.
Rozwizaniem tego problemu jest uywanie przestrzeni nazw. Ograniczaj one zasig nazwy,
w wyniku czego nazwa ma znaczenie tylko wewntrz zdefiniowanej przestrzeni nazw.
Dla programistw jzyka C++. Przestrzenie nazw w jzyku C++ s ograniczane operatorem zakresu (::). W jzyku C# suy do tego operator kropki (.).
Wskazwka dla programistw jzyka Java. Przestrzenie nazw maj wiele podobnych zalet co pakiety.
Jacek jest inynierem. Sowo inynier moe by zwizane z wieloma zawodami i wprowadza niepewno. Czy Jacek projektuje budynki? A moe opracowuje architektur systemu
operacyjnego?
Mona dookreli to stwierdzenie mwic, e Jacek skoczy Wysz Szko Budownictwa
lub pracuje przy komputerach. Programista jzyka C# mgby powiedzie, e Jacek to raczej
system.inzynier ni budynki.inzynier. Przestrze nazw, w tym przypadku system lub
budynki, ogranicza zasig sowa wystpujcego po operatorze kropki. Pozwala to utworzy
przestrze, w ktrej nazwa ma okrelone znaczenie.
Moe si te okaza, e Jacek nie jest dowolnym system.inzynier. Moliwe, e specjalizuje
si w tworzeniu architektury systemw Linux. Wtedy obiekt reprezentujcy Jacka mona
28
29
Warto zwrci uwag, e dyrektywa using znajduje si przed definicj klasy Hello. Domylnie w rodowisku Visual Studio .NET do kadej aplikacji konsolowej dodawane s trzy dyrektywy using System, System.Collections.Generics oraz System.Text.
Cho mona okreli, e w programie uywane s obiekty z przestrzeni nazw System, w odrnieniu od niektrych jzykw nie mona zrobi tego samego w przypadku obiektu System.Console. Kod przedstawiony na listingu 2.4 nie skompiluje si.
Listing 2.4. Niepoprawny kod w jzyku C#
using System.Console;
class Hello
{
static void Main()
{
// Konsola z przestrzeni nazw System
WriteLine("Witaj wiecie");
}
}
Uytkownicy Visual Studio bd wiedzie, kiedy popenili bd, poniewa po wpisaniu using System i kropki rodowisko wywietla list poprawnych przestrzeni
nazw, a Console nie jest jedn z nich.
Sowo kluczowe using pozwala oszczdzi wpisywania duych iloci kodu, jednak zmniejsza
korzyci uywania przestrzeni nazw, zamiecajc zasig wieloma nieodrnialnymi nazwami. Czsto stosowanym rozwizaniem jest uywanie sowa kluczowego using, kiedy korzysta si z wbudowanych i wasnych przestrzeni nazw, a unikanie tego w przypadku komponentw dostarczanych przez innych producentw.
Niektre grupy programistyczne stosuj polityk wpisywania dugich nazw obiektw, wraz z przestrzeniami nazw (na przykad System.Console.WriteLine()
zamiast Console.WriteLine()). Ma to suy jako forma dokumentowania kodu.
Jednak w przypadku wielokrotnie zagniedonych przestrzeni nazw takie rozwizanie moe szybko sta si niewygodne.
30
Uyteczn sztuczk jest umieszczenie kursora nad nazw, w ktrej jedynym bdem
jest niepoprawna wielko znakw, a nastpnie uycie kombinacji klawiszy Ctrl+Space.
Mechanizm uzupeniania kodu Intellisense zmieni wtedy nazw na poprawn.
Aby zapobiec takim czasochonnym i mczcym bdom, warto ustali konwencj nazywania
zmiennych, funkcji, staych i innych elementw kodu. W tej ksice do nazw zmiennych stosuj notacj wielbdzi (na przykad jakasNazwaZmiennej), a do nazw funkcji, staych i waciwoci uywam notacji z jzyka Pascal (na przykad JakasFunkcja).
Jedyna rnica midzy notacj wielbdzi a notacj z jzyka Pascal polega na rozpoczynaniu nazw wielk liter w tym drugim przypadku.
Microsoft udostpnia wskazwki dotyczce stylu kodowania, ktre s bardzo dobrym
punktem wyjcia, a czsto w zupenoci wystarczaj do tworzenia czytelnego kodu.
Mona je znale na stronie http://msdn.microsoft.com/library/default.asp?url=/library/
en-us/cpgenref/html/cpconNETFrameworkDesingGuidlines.asp.
Sowo kluczowe static informuje kompilator, e mona wywoa metod Main() bez koniecznoci tworzenia obiektu typu Hello. To do zoone zagadnienie opisuj bardziej szczegowo w kolejnych rozdziaach. Jednym z problemw uczenia si nowego jzyka programowania jest konieczno poznawania niektrych skomplikowanych mechanizmw, zanim
moliwe jest ich pene zrozumienie. Na razie mona wic traktowa deklaracj metody Main()
jako czyst magi.
31
Aby utworzy aplikacj, naley zaznaczy Visual C# w oknie Project Types, a nastpnie wybra opcj Console Application w oknie Templates. W rodowisku Express Edition jzyka Visual
C# wystarczy wybra opcj Console Application.
Nastpnie mona poda nazw projektu i wybra katalog, w ktrym przechowywane bd
pliki. Potem wystarczy klikn przycisk OK i pojawi si nowe okno, w ktrym mona wpisa
kod z listingu 2.1, co pokazane jest na rysunku 2.2.
Warto zwrci uwag, e Visual Studio .NET automatycznie tworzy przestrze nazw wedug nazwy projektu (w tym przypadku jest to HelloWorld), a take dodaje dyrektywy using
32
przestrzeni nazw System, System.Collections.Generic i System.Text, poniewa potrzebuje ich prawie kady program.
Visual Studio .NET tworzy klas o nazwie Program, ktr programista moe nazwa w inny
sposb. Przy zmianie nazwy klasy warto zmieni rwnie nazw pliku. Przy zmianie nazwy
pliku rodowisko Visual Studio automatycznie zmienia nazw klasy. Aby odtworzy kod
z listingu 2.1, mona na przykad zmieni nazw pliku Program.cs (znajduje si ona w oknie
Solution Explorer) na hello.cs a nazw klasy Program na HelloWorld. Jeli wykona si te czynnoci w odwrotnej kolejnoci, Visual Studio automatycznie zmieni nazw klasy na Hello.
Visual Studio tworzy szkielet programu. Aby napisa program z listingu 2.1, naley usun
argumenty (string[] args) metody Main(), a nastpnie wpisa w ciele tej metody dwa ponisze wiersze kodu:
// Uywa konsoli systemowej
System.Console.WriteLine("Witaj wiecie");
Mona te napisa kod, nie uywajc rodowiska Visual Studio. W tym celu naley otworzy
Notatnik lub inny edytor tekstu, wpisa kod z listingu 2.1, zapisa plik jako tekstowy i nada
mu nazw hello.cs.
33
Na przykad, aby skompilowa program Witaj wiecie, naley przycisn kombinacj klawiszy Ctrl+Shift+B lub wybra opcj BuildBuild Solution. Jeszcze inne rozwizanie to kliknicie przycisku Build na pasku narzdzi Build. Jeli pasek ten nie jest widoczny, naley klikn
prawym przyciskiem myszy na pasku narzdzi i uaktywni go. Pasek narzdzi Build przedstawiony jest na rysunku 2.3. Przycisk Build znajduje si po lewej stronie i jest zaznaczony na
rysunku.
Aby uruchomi program Witaj wiecie w trybie bez usuwania bdw, naley przycisn
kombinacj klawiszy Ctrl+F5, wybra opcj DebugStart Without Debugging z menu IDE
z paska narzdzi lub klikn przycisk Start Without Debugging na pasku narzdzi IDE Build.
Ta ostatnia moliwo przedstawiona jest na rysunku 2.4. Jeli przycisk ten nie jest widoczny,
naley zmieni ustawienia paska narzdzi. Moliwe jest uruchomienie programu bez wczeniejszej jego budowy. Ustawienia opcji (mona je zmieni, wybierajc ToolsOptions) mog
spowodowa, e IDE zapisze plik, zbuduje program, a nastpnie uruchomi go, zapewne pytajc o pozwolenie wykonania kadej kolejnej czynnoci.
Aby skompilowa i uruchomi program Witaj wiecie uywajc kompilatora C# uruchamianego z wiersza polece, udostpnianego wraz z .NET Framework SDK, z Mono (http://www.
mono-project.com) lub z Shared Source CLI (http://msdn.microsoft.com/net/sscli/), naley wykona
nastpujce czynnoci:
34
jeli uywa si kompilatora z Mono. Powoduje to utworzenie pliku .EXE. Jeli program
zawiera bdy, kompilator wywietli je. Opcja wiersza polece /debug powoduje umieszczenie w kodzie symboli, ktre umoliwiaj uruchomienie pliku o rozszerzeniu EXE
w programie uruchomieniowym lub zobaczenie numerw wierszy kodu w czasie podgldania stosu. Obraz stosu zostanie wywietlony, jeli program wygeneruje nieobsugiwany bd.
Kompilacja JIT
W trakcie kompilacji hello.cs za pomoc polecenia csc powstaje plik wykonywalny. Naley
jednak pamita, e zawiera on kod w jzyku MSIL, opisanym w rozdziale 1.
Co ciekawe, kiedy napisze si aplikacj w jzyku VB.NET lub w dowolnym jzyku zgodnym
systemem .NET CLS, zostanie ona skompilowana do bardzo podobnego kodu w jzyku MSIL.
Kod IL utworzony na podstawie kodu pisanego w rnych jzykach jest praktycznie nierozrnialny.
Oprcz tworzenia kodu IL, ktry jest podobny do kodu bajtowego jzyka Java, kompilator
tworzy w pliku o rozszerzeniu .EXE segment tylko do odczytu, w ktrym znajduje si standardowy nagwek plikw wykonywalnych systemu Win32. W tym segmencie kompilator
okrela punkt startowy, do ktrego w momencie uruchamiania programu przechodzi program
adujcy systemu operacyjnego.
System operacyjny nie potrafi jednak wykona kodu IL, dlatego punkt startowy prowadzi do
uruchomienia kompilatora JIT platformy .NET (kompilator ten zosta opisany w rozdziale 1.).
W wyniku kompilacji JIT powstaje kod maszynowy procesora, taki sam, jak w zwykych plikach wykonywalnych. Kluczow cech kompilacji JIT jest to, e funkcje kompilowane s jedynie wtedy, kiedy s uywane, bezporednio przed ich wykonaniem.
35
Ten rozdzia nie obejmuje caej dokumentacji programu uruchomieniowego, ale wymienione
powyej czynnoci s tak istotne, e z pewnoci wystarcz do rozpoczcia pracy.
Program uruchomieniowy umoliwia dostp do tych samych operacji na rne sposoby, zwykle przez opcje menu i przyciski. Najatwiejszy sposb na ustawienie punktu przerwania to
kliknicie na lewym marginesie. rodowisko IDE zaznacza punkty przerwania jako czerwone
kropki, jak przedstawione to jest na rysunku 2.5.
Aby uruchomi program uruchomieniowy, naley wybra opcj DebugStart lub przycisn
klawisz F5. Program zostanie wtedy skompilowany, a nastpnie wykonany do punktu przerwania. W tym momencie wykonywanie zatrzyma si, a ta strzaka wskae instrukcj, ktra powinna zosta wykonana jako kolejna, co pokazane jest na rysunku 2.6.
rodowisko programu uruchomieniowego udostpnia take liczne uyteczne okna, jak okno
Locals wywietlajce wartoci wszystkich zmiennych lokalnych (patrz rysunek 2.8).
W przypadku zmiennych nalecych do typw wbudowanych, na przykad liczb cakowitych, wywietlana jest ich warto. Obiekty zoonych typw posiadaj przy sobie znak plus
(+). Mona je rozwin, jak wida na rysunku 2.9. Wicej informacji o obiektach i ich danych
znajduje si w kolejnych rozdziaach.
Mona wkroczy w ciao kolejnej metody przyciskajc klawisz F11. W tym przypadku spowoduje to wejcie w ciao metody DrawWindow() klasy Window, co przedstawione jest na rysunku 2.10.
Mona zobaczy, e kolejn instrukcj jest teraz WriteLine() w metodzie DrawWindow(). Okno
Autos zostao uaktualnione i przedstawia aktualny stan obiektw.
Oczywicie to nie wszystkie moliwoci programu uruchomieniowego, jednak materia przedstawiony w tym rozdziale pozwala na rozpoczcie pracy z tym narzdziem. Pisanie krtkich
programw demonstracyjnych i sprawdzanie ich dziaania za pomoc programu uruchomieniowego pozwala udzieli odpowiedzi na wiele pyta programistycznych. Dobry program uruchomieniowy jest, w pewnym sensie, najbardziej istotnym narzdziem jzyka programowania.
Usuwanie bdw w Visual Studio .NET
37
38