uko zadania edytor tekstu UKO


Piotr Tronczyk
U K O
Visual Studio .NET
VB.NET i C#
K M K T
2 0 0 6
Spis treści
Spis tabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
Rozdzia 1. Laboratorium 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
l
1.1. Wprowadzenie do .NET Framework . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Common Language Runtime (CLR) . . . . . . . . . . . . . . . . . . . . . 1
1.1.2. Microsoft Intermediate Language (MSIL) . . . . . . . . . . . . . . . . . . 2
1.1.3. Podstawowe typy danych . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Aplikacje konsolowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1. Pierwsze aplikacje wVB.NET . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.2. Pierwsze aplikacje wC#. . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3. Operatory relacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1. Operatory relacji wVB .NET . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.2. Operatory relacji wC# . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4. Operatory logiczne i bitowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.1. Operatory logiczne i bitowe wVB .NET . . . . . . . . . . . . . . . . . . . 11
1.4.2. Operatory logiczne i bitowe wC# . . . . . . . . . . . . . . . . . . . . . . 12
1.5. Instrukcje warunkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.1. Instrukcje warunkowe wVB .NET . . . . . . . . . . . . . . . . . . . . . . 13
1.5.2. Instrukcje warunkowe wC#. . . . . . . . . . . . . . . . . . . . . . . . . . 15
Rozdzia 2. Laboratorium 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
l
2.1. Lańcuchy znaków w.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.1.1. Porównywanie napisów . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.2. Kopiowanie i konkatenacja
lańcuchów znaków . . . . . . . . . . . . . . . 20
2.1.3. Dodawanie, usuwanie oraz zastepowanie ciagów znaków . . . . . . . . . . 21

2.1.4. Zmiana wielkości liter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
i
Spis treści
2.1.5. Formatowanie napisów . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.6. Formatowanie daty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.7. Wycinanie bia znaków . . . . . . . . . . . . . . . . . . . . . . . . . . 26
lych
2.1.8. Dope
lnianie lańcuchów znaków . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.9. KlasaStringBuilder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2. Petle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.2.1. KonstrukcjaFor...NextVB.NET. . . . . . . . . . . . . . . . . . . . . . . 30
2.2.2. KonstrukcjaforC# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.2.3. KonstrukcjaDo While...Loop VB.NET . . . . . . . . . . . . . . . . . . . 35
2.2.4. KonstrukcjaDo...Loop While VB.NET . . . . . . . . . . . . . . . . . . . 35
2.2.5. KonstrukcjaDo...Loop Until VB.NET . . . . . . . . . . . . . . . . . . . 36
2.2.6. Konstrukcjawhile C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.2.7. Konstrukcjado...while C# . . . . . . . . . . . . . . . . . . . . . . . . . 37
Rozdzia 3. Laboratorium 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
l
3.1. Tablice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.1.1. Tablice wVB.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.1.2. Tablice wC# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2. Funkcje matematyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3. Obs wyjatków . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
luga

3.3.1. WyjatkiVB.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.3.2. WyjatkiC#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Rozdzia 4. Laboratorium 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
l
4.1. Klasy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.1.1. Klasy wVB.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.2. Klasy wC#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.1.3. Przecia żanie metod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.4. W
laściwości (properties) . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Rozdzia 5. Laboratorium 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
l
5.1. Aplikacje Okienkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2. Prosty kalkulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.2.1. KodVB.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.2.2. KodC# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
ii
Spis treści
5.3. Zegarek elektroniczny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3.1. KodC# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
S
lowniczek skrótów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Spis tabel
1.1.1 Zestawienie typów danych dlaVB.NET,C#oraz ich odpowiedniki wCTS . . . . . . . . 4
1.3.1 Zestawienie podstawowych operatorów relacji dlaVB .NET . . . . . . . . . . . . . . 10
1.3.2 Zestawienie podstawowych operatorów relacji dlaC# . . . . . . . . . . . . . . . . . 11
1.4.1 Zestawienie podstawowych operatorów logicznych dlaVB .NET . . . . . . . . . . . . 11
1.4.2 Zestawienie podstawowych operatorów logicznych dlaC# . . . . . . . . . . . . . . . 12
2.1.1 Znaczenie wartości zwracanych przez metode Compare . . . . . . . . . . . . . 18

2.1.2 Formatowanie liczb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.3 W znaczniki formatowania liczb . . . . . . . . . . . . . . . . . . . . . . . . 24
lasne
2.1.4 Znaczniki formatowania daty . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.5 Znaczniki formatowania daty . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.6 W
laściwości klasyStringBuilder. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.7 Metody klasyStringBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1 Funkcje matematyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.1 Wyjatki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.1.1 Modyfikatory klasowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
iv
Rozdzia 1
l
Laboratorium 1
1.1. Wprowadzenie do .NET Framework
1.1.1. Common Language Runtime (CLR)
Najważniejsza cecha środowiska.NETjest wspólne środowisko uruchomienio-
we (ang. Common Language Runtime, w skrócieCLR). Jest to warstwa znajdujaca

sie  ponad systemem operacyjnym, obs
lugujaca wykonanie wszystkich aplikacji śro-

dowiska.NET. Programy napisane na platforme.NETkomunikuja sie z systemem

operacyjnym poprzezCLR.
Aplikacja .NET
Common Language Runtime
(CLR)
System Operacyjny
(Windows)
Rys. 1.1.1. Schemat komunikacji
CLRto podstawa ca systemu.NET Framework. Wszystkie jezyki środowiska.NET
lego

(na przyk
ladC#czyVisual Basic .NET), a także wszystkie biblioteki klas obecne
1
1.1. Wprowadzenie do .NET Framework
w.NET Framework(ASP.NET,ADO.NETi inne) oparte sa naCLR. Ponieważ nowe,
tworzone przez firmeMicrosoftoprogramowanie, także oparte jest na.NET Fra-

mework, każdy, kto chce korzystać ze środowiskaMicrosoft, predzej czy pózniej

bedzie musia zetkna ć sie zCLR.
l

ŚrodowiskoCLRkompiluje i wykonuje zapisany w standardowym jezyku pośrednim

Microsoft(MSIL) kod aplikacji zwany kodem zarzadzanym (ang. managed code),

zapewniajac wszystkie podstawowe funkcje konieczne do dzia aplikacji. Podsta-
lania

wowym elementemCLRjest standardowy zestaw typów danych, wykorzystywanych
przez wszystkie jezyki oparte naCLR, a także standardowy format metadanych, s
lu-

żacych do opisu oprogramowania wykorzystujacego te typy danych.CLRzapewnia

także mechanizmy umożliwiajace pakowanie kodu zarzadzanego w jednostki zwane

podzespo
lami.
WCLRwbudowane sa także mechanizmy kontroli bezpieczeństwa wykonywania apli-
kacji  bezpieczeństwo oparte na uprawnieniach kodu (ang. Code Access Security,
w skrócieCAS) oraz bezpieczeństwo oparte na rolach (ang. Role-Based Security, w
skrócieRBS).
1.1.2. Microsoft Intermediate Language (MSIL)
Kompilujac aplikacje środowiska.NET, napisana w dowolnym jezyku wchodzacym

w sk środowiska (np.C#czyVB.NET), nie jest dokonywana konwersja na wyko-
lad
nywalny kod binarny, ale tworzony jest kod pośredni, nazywanyMSILlubIL, który
jest zrozumia dla warstwyCLR.
ly
Kompilacja
,,w locie 
Kod programu w
Wykonwyalny
dowolnym języku Kod MSIL
kod maszynowy
podczas
platformy .NET
wykonywania
programu
Rys. 1.1.2. Schemat wykonania
MSILto kod dość podobny do zestawu instrukcji procesora. Obecnie nie istnieje jed-
nak żaden sprzet, który móg bezpośrednio wykonywać kodMSIL(nie jest jednak
lby

wykluczone, że w przysz taki sprzet powstanie). Na razie kodMSILmusi być
lości

t
lumaczony na jezyk maszynowy procesora, na którym ma być uruchomiony.

Kompilacja kodu zród jezyka wyższego poziomu na kod pośredni jest podsta-
lowego

wowa technika, wykorzystywana przez nowoczesne kompilatory. Kompilatory pa-

kietu Visual Studio t lowy
lumacza kod zród różnych jezyków na taki sam kod

pośredni, który nastepnie kompilowany jest na kod maszynowy przez jeden wspól-

ny kompilator. To w ten kod maszynowy stanowi finalny kod aplikacji przed
laśnie l
wprowadzeniem środowiska.NET Framework.
Przenaszalność nie jest jedyna zaleta stosowania jezyka pośredniego. Odmiennie niż

w przypadku kodu maszynowego, który może zawierać wskazniki do dowolnych ad-
resów, kodMSILmoże przed uruchomieniem zostać sprawdzony pod wzgledem bez-

2
1.1. Wprowadzenie do .NET Framework
pieczeństwa typów. Podnosi to poziom bezpieczeństwa i daje wieksza niezawodność,

gdyż dzia takie pozwala na wykrycie pewnych rodzajów b edów oraz wielu prób
lanie l

ataków.
Najcześciej stosowana metoda kompilacji koduMSILna kod natywny jest za
lado-

wanie przezCLRpodzespo do pamieci, a nastepnie kompilacja każdej metody w
lu

momencie pierwszego jej wywo Ponieważ każda metoda kompilowana jest tylko
lania.
w momencie pierwszego uruchomienia, proces kompilacji nazywa sie kompilacja w

sama pore (ang. just-in-time compilation, w skrócieJIT).

KompilacjaJITumożliwia kompilowanie tylko tych metod, które sa rzeczywiście
wykorzystywane. Jeśli metoda zosta za lym
la ladowana do pamieci razem z ca podze-

spo ale nigdy nie zosta wywo pozostanie w pamieci komputera w postaci
lem, la lana,

MSIL. Skompilowany kod maszynowy nie jest zapisywany z powrotem na dysk twardy
 przy ponownym uruchomieniu aplikacji kodMSILbedzie musia zostać ponownie
l

skompilowany.
Inna metoda kompilacji jest wygenerowanie ca kodu binarnego danego podze-
lego
spo z użyciem narzedziaNGEN(ang. Native Image Generator, w skrócieNGEN), do-
lu

stepnego w.NET Framework SDK. Narzedzie to, uruchamiane poleceniemngen.exe,

kompiluje ca podzespó i umieszcza jego kod maszynowy w obszarze zwanym pa-
ly l
miecia podreczna obrazów kodu natywnego (ang.Native Image Cache, w skrócie

NIC). Pozwala to na szybsze uruchamianie aplikacji, ponieważ podzespo nie musza
ly
już być kompilowane metoda JIT.
Kompilacja koduMSILna kod maszynowy pozwala na sprawdzenie bezpieczeństwa
typów danych. Proces ten, zwany weryfikacja, sprawdza kodMSILoraz metadane

metod pod katem prób niepowo uzyskania dostepu do zasobów systemu. Na
lanego

tym etapie sprawdzane sa także ustawienia bezpieczeństwa dla kodu. Administrator
systemu może wy aczyć te funkcje, jeśli nie jest ona potrzebna.
l

1.1.3. Podstawowe typy danych
Jezyk programowania to po aczenie sk oraz zbioru s ów kluczowych, umożli-
l ladni l

wiajace definiowanie danych oraz operacji przeprowadzanych na tych danych. Różne

jezyki różnia sie pod wzgledem sk jednak podstawowe pojecia sa dość podobne
ladni,

 wiekszość jezyków obs takie typy danych jak liczba ca
luguje lkowita czy lańcuch

znaków i umożliwia porzadkowanie kodu w metody oraz zbieranie metod i danych w

klasy Przy zachowaniu odpowiedniego poziomu abstrakcji, możliwe jest zdefiniowa-
nie zestawu typów danych niezależnego od sk jezyka. Zamiast laczyć sk
ladni ladnie

(syntaktyke) i semantyke, można je określić oddzielne, co pozwoli na zdefiniowanie

wiekszej liczby jezyków korzystajacych z tych samych pojeć (typów danych). Takie

w podejście zastosowano wCLR. Wspólny zestaw typów danych (ang. Common
laśnie
Type System, w skrócieCTS) nie jest zwiazany z żadna sk lub s
ladnia lowami kluczo-

wymi  - definiuje jedynie zestaw typów danych, który może być wykorzystywany
przez wiele jezyków. Każdy jezyk zgodny zCLRmoże używać dowolnej sk ale
ladni,

musi korzystać przynajmniej z cześci typów danych zdefiniowanych przezCTS.

Zestaw typów danych definiowany przezCTSnależy do g ównych sk
l ladnikówCLR.
3
1.1. Wprowadzenie do .NET Framework
Każdy jezyk programowania oparty naCLRmoże udostepniać programiście te typy

danych we w
laściwy sobie sposób. Twórca jezyka może skorzystać tylko z niektórych

typów danych, może też definiować w typy danych. Jednak wiekszość jezyków
lasne

wszechstronnie korzysta zCTS.
Tabela 1.1.1. Zestawienie typów danych dlaVB.NET,C#oraz ich odpowiedniki wCTS
VB.Net C# .NET Rozmiar Komentarz
Boolean bool Boolean 1 wartość logiczna (prawda lub fa
lsz)
Char char Char 2 znak Unicode
Liczby ca
lkowite
Byte byte Byte 1 8-bitowa liczba ca
lkowita bez znaku
SByte sbyte SByte 1 8-bitowa liczba ca
lkowita ze znakiem
Short short Int16 2 16-bitowa liczba ca
lkowita ze znakiem
Integer int Int32 4 32-bitowa liczba ca
lkowita ze znakiem
Long long Int64 8 64-bitowa liczba ca
lkowita ze znakiem
Liczby zmiennoprzecinkowe
Single float Single 4 pojedynczej precyzji
Double double Double 8 podwójnej precyzji
Decimal decimal Decimal 12 96-bitowa liczba dziesietna

4
1.2. Aplikacje konsolowe
1.2. Aplikacje konsolowe
1.2.1. Pierwsze aplikacje wVB.NET
Pierwsza aplikacja środowiska.NETzostanie przedstawiona na przyk jezyka
ladzie

Visual Basic .NET. Po uruchomieniu środowiska z menuFilewybieramy opcje

New, a nastepnieProject.

Rys. 1.2.1. Tworzenie nowego projektu
Na ekranie powinno pojawić sie okienko przedstawione na Rys. 1.2.1 (wyglad okienka

może być różny w zależności od wersji środowiskaVisual Studiotutaj przedsta-
wiono okienko w wersji 2005). WybieramyVisual Basicz listyProject Types,
nastepnie wybieramyConsole Applicationz listyTemplates. W poleNamewpi-

sujemy nazwe aplikacji, w pozycjiLocationwybieramy po projektu na dysku
lożenie

i zatwierdzamy guzikiemOK.
W wyniku zostanie wygenerowany nastepujacy szablon aplikacji konsolowej dla je-

zykaVisual Basic .NET.
Module Module1
Sub Main ( )
End Sub
End Module
5
1.2. Aplikacje konsolowe
ProceduraSub Mainjest punktem rozpoczecia wykonywania aplikacji konsolowej w

jezyku VB.NET. Dopiszmy linijke kodu do wygenerowanego szkieletu aplikacji:

Module Module1
Sub Main ( )
Console . WriteLine (  H e l l o World !  )
End Sub
End Module
Aby skompilować oraz wykonać aplikacje z menuDebugwybieramy opcjeStart, lub

aby wykonać aplikacje bez debugowania wciskamy kombinacjeCtrl+F5. Powinniśmy

zobaczyć okienko konsoli zawierajace s World!, a aby zakończyć dzia
lowaHello lanie

aplikacji naciskamy dowolny klawisz.
Teraz przejdziemy do troche bardziej interaktywnej aplikacji, której zadaniem bedzie

zapytanie użytkownika o imie, a nastepnie przywitanie go używajac wprowadzona

przez użytkownika informacje.

Module Module1
Sub Main ( )
Console . Write (  Jak masz na imie ?  )

Dim name As S t r i n g = Console . ReadLine ( )
Console . WriteLine (  Witaj {0}  , name )
End Sub
End Module
W powyższym przyk do wypisania tekstu zamiast metodyWriteLineklasy
ladzie
Consoleużyliśmy metodyWrite. Różnica polega na tym, że po wypisaniu tekstu
kursor teraz nie przechodzi do nowej linii. Kolejna linia programu zawiera deklaracje

zmiennejnametypuString, na której przypisujemy wartość zwrócona przez metode

ReadLine()klasyConsole. Zmienne moga przechowywać różne typy danych, np.
zmienna typuIntegermoże przechowywać liczby ca
lkowite, typStringnatomiast
przechowuje zmienne w postaci lańcucha znaków. Ostatnia linijka kodu wypisuje

tekst na ekranie używajac metodyWriteLine, zastepujac wystepujacy w napisie

znacznik{0}wartościa zmiennej przekazanej jako pierwszy parametr (w naszym
przypadkuname).
Console . WriteLine (  Witaj {0}  , name )
Jeśli pierwszym parametrem metodyWriteLinew przekazanym napisie jest znacz-
nik{n}, to kompilator zastepuje go wartościa (n+1)zmiennej wystepujacej po na-

pisie  w naszym przypadku znacznik{0}zastepowany jest(0+1)-a zmienna, czyli

name. Jeżeli zmiennanamezawiera np. napisJanek, toCLRpodczas wykonania pro-
gramu zinterpretuje wywo tej funkcji jako:
lanie
Console . WriteLine (  Witaj Janek  )
6
1.2. Aplikacje konsolowe
Linia kodu zawierajaca s kluczoweDim
lowo

Dim name As S t r i n g = Console . ReadLine ( )
spowoduje zadeklarowanie zmiennej o nazwienametypuString, natomiast znak
=oznacza w tym przypadku instrukcje przypisania, gdzie zmiennejnamezostaje

przypisana wartość zwracana przez metodeReadLine(), a w naszym przypadku

bedzie to tekst wprowadzony z klawiatury przez użytkownika.

W jezykuVisual Basic .Netistnieje również możliwość deklarowania sta Róż-
lych.

nica w stosunku do deklarowania zmiennych jest taka, że wartość sta w trakcie
lej
realizacji programu nie może ulec zmianie, czyli nie można jej przypisać żadnej no-
wej wartości, natomiast wartość przypisywana jest już w momencie deklaracji. Na
przyk deklaracja sta
lad, lejPImoże wygladać nastepujaco:

Dim PI As Double = 3 .1415
Na zmiennych typu liczbowego możemy wykonywać operacje matematyczne. Cztery
podstawowe operatory to:+, -, *, /. Napiszmy teraz aplikacje, która pobierze od

użytkownika dwie wartości, a nastepnie wyświetli wynik dzia przedstawionych
lania

operatorów matematycznych na tych wartościach.
Zak ladamy w
ladamy, że wprowadzany przez użytkownika tekst jest liczba, a wiec zak

tym momencie, że wprowadzone dane beda poprawne (w przeciwnym razie program

zg nam wyjatek, czyli b ad). Sprawa kontroli poprawności wprowadzanych danych
losi l

i obs wyjatków zajmiemy sie pózniej.
luga

Module Module1
Sub Main ( )
Dim l i c z b a 1 As Double
Dim l i c z b a 2 As Double
Console . Write (  Podaj pie rw s z a l i c z b e :  )

l i c z b a 1 = Console . ReadLine ( )
Console . Write (  Podaj druga l i c z b e :  )

l i c z b a 2 = Console . ReadLine ( )
Console . WriteLine (  {0} + {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 + l i c z b a 2 )
Console . WriteLine (  {0} - {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 - l i c z b a 2 )
Console . WriteLine (  {0} " {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 " l i c z b a 2 )
Console . WriteLine (  {0} / {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 / l i c z b a 2 )
End Sub
End Module
7
1.2. Aplikacje konsolowe
Zauważmy pojawienie sie znaku _ w metodzieWriteLine. Znak ten oznacza wVi-

sual Basic u, że chcemy z wiersz i kontynuować instrukcje w nowym wierszu.
lamać

Zapis bez znaku _ bedzie traktowany jako b edny.
l

Console . WriteLine (  {0} + {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 + l i c z b a 2 )
Powyższa linia kodu spowoduje zg l ladni,
loszenie b edu sk edytor podświetli miejsce
wystapienia b edu.
l

1.2.2. Pierwsze aplikacje wC#
Teraz zajmiemy sie jezykiemC#i postaramy sie napisać przedstawione do tej pory

programy z wykorzystaniem tego jezyka.

Rozpoczniemy standardowo od aplikacji wypisujacej na konsoli tekstHello World!.

W tym celu musimy utworzyć nowy projekt, tym razem wybierajac jezykC#. Zosta-

nie wygenerowany szkielet aplikacji konsolowej w jezykuC#, który możemy, podobnie

jak w poprzednim przypadku jezykaVB .NET, uzupe o linijke zawierajaca kod
lnić

wypisujacy tekst na konsoli:

u s i ng System ;
u s i ng System . C o l l e c t i o n s . Generic ;
u s i ng System . Text ;
namespace C o ns o l e A p p l i c a t i o n 1 {
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
Console . WriteLine (  H e l l o World !  ) ;
}
}
}
Zwróćmy uwage, że w odróżnieniu odVB .NET, linijka zawierajaca instrukcje zakoń-

czona jest średnikiem.
Kolejna modyfikacja bedzie dodanie interakcji z użytkownikiem, czyli napiszemy

analogiczny program jak w przypadkuVB .NET, który zapyta użytkownika o imie

i nastepnie wyświetli odpowiednie powitanie zawierajace wprowadzony przez użyt-

kownika tekst.
8
1.2. Aplikacje konsolowe
namespace C o ns o l e A p p l i c a t i o n 1 {
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
Console . Write (  Jak masz na imie ?  ) ;

s t r i n g name = Console . ReadLine ( ) ;
Console . WriteLine (  Witaj {0}  , name ) ;
}
}
}
Jedyna istotna różnica w stosunku do kodu napisanego wVB .NETpolega na sposo-
bie deklarowania zmiennych. W przypadkuC#zmienna namedeklarujemy podajac

najpierw nazwe typu (tutaj string), a nastepnie nazwe zmiennej.

Kolejny przyk
lad:
namespace C o ns o l e A p p l i c a t i o n 1 {
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
double l i c z b a 1 ;
double l i c z b a 2 ;
Console . Write (  Podaj p i e r ws z a l i c z b e :  ) ;

l i c z b a 1 = double . Parse ( Console . ReadLine ( ) ) ;
Console . Write (  Podaj druga l i c z b e :  ) ;

l i c z b a 2 = double . Parse ( Console . ReadLine ( ) ) ;
Console . WriteLine (  {0} + {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 + l i c z b a 2 ) ;
Console . WriteLine (  {0} - {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 - l i c z b a 2 ) ;
Console . WriteLine (  {0} " {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 " l i c z b a 2 ) ;
Console . WriteLine (  {0} / {1} = {2}  ,
l i c z b a 1 , l i c z b a 2 , l i c z b a 1 / l i c z b a 2 ) ;
}
}
}
Tak samo jak w przypadkuVB .NET, dla typów liczbowych dostepne sa podstawowe

operatory, czyli możemy przepisać program pobierajacy dwie liczby i wypisujacy

wynik operacji dodawania, odejmowania, mnożenia oraz dzielenia.
Różnica w zapisie pomiedzy kodemVB .NETorazC#jest widoczna przy instrukcjach

pobierajacych dane od użytkownika.

l i c z b a 1 = double . Parse ( Console . ReadLine ( ) ) ;
9
1.3. Operatory relacji
Ponieważ wartość zwracana przez metodeReadLine()jest typustring, piszac pro-

gram wC#musimy dokonać konwersji pobranej wartości na tymdouble, w przy-
padkuVB .NETkonwersja ta by dokonana niejawnie.
la
W celu dokonania konwersji skorzystamy z metodyParse, zdefiniowanej na typie
double, która stara sie przekonwertować napis na liczbe. Oczywistym jest, że w przy-

padku wprowadzenia napisu, który nie może zostać poprawnie przekonwertowany na
liczbe, program podczas wykonania zg wyjatek.
losi

1.3. Operatory relacji
Instrukcje warunkowe wykonywane sa w zależności od wyniku jaki przyjmuje pewne
wyrażenie logiczne. Ważna grupa operatorów sa operatory relacji, pozwalajace okre-

ślić w jakiej relacji sa ze soba zmienne. Wynikiem dzia operatora relacji jest
lania
wartośćtruelubfalse.
1.3.1. Operatory relacji wVB .NET
JezykVB .NETdostarcza sześć podstawowych operatorów relacji:

Tabela 1.3.1. Zestawienie podstawowych operatorów relacji dlaVB .NET
Operator Znaczenie
= sprawdzenie równości
> wieksze niż

>= wieksze równe

<> różne
< mniejsze niż
<= mniejsze równe
Przyk dzia operatorów relacji:
ladowe lanie
Dim num1 As i n t e g e r = 1 , num2 As I n t e g e r = 4
. . .
num1 = num2 wynik f a l s e | num1 < num2 wynik t r u e
num1 <> num2 wynik t r u e | num1 <= num2 wynik t r u e
num1 > num2 wynik f a l s e | num1 >= num2 wynik f a l s e
Operatory relacji moga być stosowane tylko do kompatybilnych typów, a wiec np.

nie można dokonać porównania zmiennej typuIntegerze zmienna typuBoolean.
1.3.2. Operatory relacji wC#
JezykC#dostarcza również sześć podstawowych operatorów relacji:

10
1.4. Operatory logiczne i bitowe
Tabela 1.3.2. Zestawienie podstawowych operatorów relacji dlaC#
Operator Znaczenie
== sprawdzenie równości
> wieksze niż

>= wieksze równe

!= różne
< mniejsze niż
<= mniejsze równe
Przyk dzia operatorów relacji:
ladowe lanie
i n t num1 = 1 , num2 = 4 ;
. . .
num1 == num2 wynik f a l s e
num1 != num2 wynik t r u e
num1 > num2 wynik f a l s e
num1 < num2 wynik t r u e
num1 <= num2 wynik t r u e
num1 >= num2 wynik f a l s e
1.4. Operatory logiczne i bitowe
Operatory logiczne i bitowe sa używane do wyliczania wartości wyrażeń logicznych,
oraz do operacji logicznych na bitach.
1.4.1. Operatory logiczne i bitowe wVB .NET
Zestawienie operatorów dla jezykaVisual Basic .NET:

Tabela 1.4.1. Zestawienie podstawowych operatorów logicznych dlaVB .NET
Operator Znaczenie
And logiczne lub bitowe AND
Or logiczne lub bitowe OR
Xor logiczne lub bitowe XOR
Not logiczne lub bitowe NOT
AndAlso logiczne AND forma z leniwym wyliczaniem wartości
OrElse logiczne OR forma z leniwym wyliczaniem wartości
Jeżeli operator zostanie zastosowany do zmienny typuBooleanwynikiem bedzie

wartośćtruelubfalse, natomiast zastosowanie operatora do liczb typuInteger
zwróci jako wynik liczbe bo zastosowaniu operatora logicznego na poszczególnych

bitach operandów (nie dotyczy operatorówAndAlsoorazOrElse).
OperatoryAndAlsoorazOrElsestosuja tak zwana leniwa metode wyliczania war-

tości logicznej. W przypadku operatoraAndAlso, jeżeli pierwszy operand posiada
11
1.4. Operatory logiczne i bitowe
wartośćfalse, to drugi nie jest już liczony i wynikiem jest oczywiście wartośćfalse.
W przypadku operatoraOrElse, jeżeli pierwszy operand przyjmuje wartość true, to
drugi nie jest wyliczany i ca wyrażenie przyjmuje wartośćtrue. Przyk użycia
le lady
operatorów logicznych:
Dim num1 As Double = 1 , num2 As Double = 3
Dim b As Boolean = f a l s e
. . .
(num1 > num2) And (num2 > 1) wynik f a l s e
(num1 = num2) Or (num1 < 2) wynik t r u e
Not b wynik t r u e
Przyk użycia operatorów bitowych:
lady
Dim num1 As Double = 1 , num2 As Double = 3
. . .
num1 And num2 wynik 1
num1 Or num2 wynik 3
num1 Xor num2 wynik 2
Zastosowanie operatorów bitowych można zobrazować w nastepujacy sposób:

liczba1w zapisie binarnym reprezentowana jest jako01, natomiast liczba3jako
11. Wykonanie operacjiAndda w wyniku pierwszy bit nowej liczby0 And 1, czyli
0, oraz drugi bit nowej liczby jako1 And 1, czyli1. Nowa liczba wynosi wiec1. Dla

operatoraOrpostepowanie jest analogiczne, z tym, że0 Or 1daje1,1 Or 1daje

1, wiec nowa liczba w zapisie binarnym to11, czyli w zapisie dziesietnym3.

1.4.2. Operatory logiczne i bitowe wC#
Zestawienie operatorów dla jezyka C#:

Tabela 1.4.2. Zestawienie podstawowych operatorów logicznych dlaC#
Operator Znaczenie
&& logiczne AND
|| logiczne OR
& bitowe AND
| bitowe OR
'" bitowe XOR
! bitowe NOT
12
1.5. Instrukcje warunkowe
Przyk użycia operatorów logicznych i bitowych:
lady
i n t num1 = 1 , num2 = 3 ;
bool b = f a l s e ;
. . .
num1 & num2 wynik 1
(num1 > num2) | | ! b ) wynik t r u e
1.5. Instrukcje warunkowe
Przedstawione do tej pory przyk programów by ma ciekawe, ponieważ wynik
lady ly lo
ich dzia by z góry znany. W praktycznym programowaniu nie można obejść sie
lania l

bez instrukcji warunkowych, które pozwalaja na wykonanie odpowiednich fragmen-
tów kodu w zależności od spe
lnienia, lub nie, pewnych warunków logicznych.
1.5.1. Instrukcje warunkowe wVB .NET
Podstawowa instrukcja warunkowa w jezykuVB .NETto instrukcjaIf. Sk tej
ladnia

instrukcji wyglada nastepujaco:

I f Then

E l s e

End I f
KlauzulaElseprzedstawiona powyżej jest opcjonalna, a typowy przyk zastoso-
lad
wania instrukcjiIfma postać
I f i =5 Then
Console . WriteLine (  zmienna i p r z y j e a wartość 5  )
l

End I f
Przedstawiony powyżej kod wypisze na konsoli komunikat tylko w przypadku, kiedy
zmiennaiprzyjmie wartość5, czyli gdy wyliczony warunek logicznyi = 5przyjmie
wartośćtrue.
I f i =5 Then
Console . WriteLine (  zmienna i p r z y j e a wartość 5  )
l

E l s e
Console . WriteLine (  zmienna i n i e p r z y j e l a wartość 5  )


End I f
Powyższy kod w zależności od spe warunku logicznegoi = 5, lub jego nie
lnienia
spe
lnienia, wypisze na konsoli odpowiedni tekst.
13
1.5. Instrukcje warunkowe
Kolejna wersja instrukcji warunkowejIfjest zastosowanie klauzuliElseIf.
I f i =5 Then
Console . WriteLine (  zmienna i p r z y j e l a wartość 5  )


E l s e I f i =6
Console . WriteLine (  zmienna i n i e p r z y j e l a wartość 6  )


E l s e
Console . WriteLine (  zmienna i n i e p r z y j e l a ani w a r t o ś c i 5 ani 6  )


End I f
Ponieważ konstrukcjaIf ...Then ...Elsejest także instrukcja, to można ja za-

gniezdzić w innej instrukcjiIf.
I f i >5 Then
I f i =6 Then
Console . WriteLine (  zmienna i p r z y j e l a wartość 6  )


E l s e
Console . WriteLine (  zmienna i j e s t > 5 a l e <> 6  )
End I f
E l s e
Console . WriteLine (  zmienna i p r z y j e a wartość <= 5  )
l

End I f
KonstrukcjaSelect ... Case
Jeżeli trzeba dokonać sprawdzenia zajścia jakiś warunków dla pewnej zmiennej, to
zamiast konstrukcjiIf ... Then ... ElseIf, wygodnie jest zastosować konstruk-
cjeSelect Case

S e l e c t
Case

Case

. . . .

Case E l s e

End S e l e c t
14
1.5. Instrukcje warunkowe
Przyk zastosowanie konstrukcjiSelect Case:
ladowe
Module Module1
Sub Main ( )
Dim i As I n t e g e r
i = Console . ReadLine ( )
S e l e c t Case i
Case 1
Console . WriteLine (  Wprowadzono 1  )
Case 2
Console . WriteLine (  Wprowadzono 2  )
Case 3 To 5
Console . WriteLine (  Wprowadzono wartość <3,5>  )
Case E l s e
Console . WriteLine (  Wprowadzona wartość > 5 lub < 1  )
End S e l e c t
End Sub
End Module
Kiedy użytkownik wprowadzi1wykona sie pierwszy blok:Casewypisze tekstwpro-

wadzono 1. Podobnie bedzie dla2. W przypadku wpisania3, 4lub5, wykona sie

trzeci blokCase, natomiast kiedy wprowadzona liczba bedzie mniejsza od1lub

wieksza od5, wykonana zostanie ostatnia klauzula, czyliCase Else.

1.5.2. Instrukcje warunkowe wC#
i f (){

}
e l s e {

}
Typowe zastosowanie konstrukcjiIf.
i f ( i = = 5)
Console . WriteLine (  Zmienna i p r z y j e l a wartość 5  ) ;


W przypadku, kiedy po instrukcjiifwystepuje tylko jedna instrukcja, można opuścić

nawiasy klamrowe. Używane sa one tylko w sytuacji, gdy w momencie spe
lnienia
warunku wykonany ma być blok kilku instrukcji.
i f ( i = = 5)
Console . WriteLine (  Zmienna i p r z y j e l a wartość 5  ) ;


e l s e
Console . WriteLine (  Zmienna i n i e p r z y j e l a w a r t o ś c i 5  ) ;


15
1.5. Instrukcje warunkowe
Powyższy kod w zależności od spe warunku logicznegoi = 5, lub jego nie
lnienia
spe
lnienia, wypisze na konsoli odpowiedni tekst.
Zagnieżdżenie instrukcjiif:
i f ( i > 5)
{
i f ( i = = 6)
Console . WriteLine (  Zmienna i p r z y j e l a wartość 6  ) ;


e l s e
Console . WriteLine (  Zmienna i j e s t > 5 a l e <> 6  ) ;
}
e l s e
Console . WriteLine (  Zmienna i p r z y j e l a wartość <= 5  ) ;


16
1.5. Instrukcje warunkowe
Konstrukcjaswitch
Odpowiednikiem konstrukcjiSelect CasewVB .NETjest w jezykuC#konstrukcja

switch.
sw itc h ()
{
c a s e :
;
break ;
c a s e :
;
break ;
. . . .

d e f a u l t :
;
break ;
}
Przyk zastosowania konstrukcjiswitch:
lad
i = i n t . Parse ( Console . ReadLine ( ) ) ;
switch ( i )
{
c a s e 1 :
Console . WriteLine (  Wprowadzono 1  ) ;
break ;
c a s e 2 :
Console . WriteLine (  Wprowadzono 2  ) ;
break ;
c a s e 3 :
c a s e 4 :
c a s e 5 :
Console . WriteLine (  Wprowadzono wartość <3,5>  ) ;
break ;
d e f a u l t :
Console . WriteLine (  Wprowadzona wartość > 5 lub < 1  ) ;
break ;
} // k o n i e c bloku sw itc h
Różnice sk
ladniowe pomiedzy konstrukcjamiSelect CaseaswitchwVB .NEToraz

wC#można latwo zauważyć analizujac przyk Pare s ów komentarza wymaga
lady. l

zastosowanie s kluczowegobreakw konstrukcjiswitch. Kiedy spe jest
lowa lniony
warunek dla jednej z klauzulcase, (np. za óżmy że zmiennaiposiada wartość
l
2, wypisany zostanie wiec napis:wprowadzono 2). Gdyby usuna ć s kluczowe
lowo

break, wystapi b ad sk (dla osób programujacych wClub wC++: brak s
lby l ladni lowa

breakw konstrukcjiswitchjezykaClubC++spowodowa wykonanie kolejnych
lby

klauzulcase, tak jakby warunek by spe
l lniony).
17
Rozdzia 2
l
Laboratorium 2
2.1. Lańcuchy znaków w.NET

Biblioteka.NET Frameworkdostarcza narzedzia do pracy z lańcuchami znaków. Na-


rzedzia te sa wspólne dla wszystkich jezyków środowiska.NET, miedzy innymi dla

VB.NETorazC#.
2.1.1. Porównywanie napisów
Metoda Compare klasy String dokonuje porównania dwóch napisów i zwraca wynik
w postaci liczby ca
lkowitej. Zwrócona wartość ma nastepujace znaczenie:

Tabela 2.1.1. Znaczenie wartości zwracanych przez metode Compare

wartość znaczenie
mniejsza od zera pierwszy napis jest mniejszy od drugiego
zero napisy sa sobie równe
wieksze od zera pierwszy napis jest wiekszy od drugiego

Inna możliwościa jest użycie metody CompareTo dla zmiennej typu String (metoda
umożliwia porównanie obiektu z napisem). Zwracana wartość jest identyczna jak w
przypadku metody Compare
18
2.1. Lańcuchy znaków w.NET

Przyk
ladowy kod VB.NET
Przyk
ladowy kod porównuje dwa napisy i wyświetla wynik na konsoli:
Sub Main ( )
Dim napi s1 As S t r i n g
Dim napi s2 As S t r i n g
Dim wynik As I n t e g e r
Console . Write (  Podaj pierwsz y n a p i s :  )
napis1 = Console . ReadLine ( )
Console . Write (  Podaj d r ug i n a p i s :  )
napis2 = Console . ReadLine ( )
wynik = S t r i n g . Compare ( napis1 , napis2 )
Console . WriteLine (  Wynik porównania : {0}  , wynik )
End Sub
Zastosowanie metody CompareTo
Sub Main ( )
Dim napi s1 As S t r i n g
Dim napi s2 As S t r i n g
Dim wynik As I n t e g e r
Console . Write (  Podaj pierwsz y n a p i s :  )
napis1 = Console . ReadLine ( )
Console . Write (  Podaj d r ug i n a p i s :  )
napis2 = Console . ReadLine ( )
wynik = n apis 1 . CompareTo ( na pis2 )
Console . WriteLine (  Wynik porównania : {0}  , wynik )
End Sub
Przyk
ladowy kod dla C#
Przyk
ladowy kod porównuje dwa napisy i wyświetla wynik na konsoli:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
s t r i n g napis2 ;
i n t wynik ;
Console . Write (  Podaj pierwsz y n a p i s :  ) ;
napis1 = Console . ReadLine ( ) ;
Console . Write (  Podaj d r ug i n a p i s :  ) ;
napis2 = Console . ReadLine ( ) ;
wynik = S t r i n g . Compare ( napis1 , napis2 ) ;
Console . WriteLine (  Wynik porównania : {0}  , wynik ) ;
}
19
2.1. Lańcuchy znaków w.NET

Zastosowanie metody CompareTo
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
s t r i n g napis2 ;
i n t wynik ;
Console . Write (  Podaj pierwsz y n a p i s :  ) ;
napis1 = Console . ReadLine ( ) ;
Console . Write (  Podaj d r ug i n a p i s :  ) ;
napis2 = Console . ReadLine ( ) ;
wynik = n apis 1 . CompareTo ( na pis2 ) ;
Console . WriteLine (  Wynik porównania : {0}  , wynik ) ;
}
2.1.2. Kopiowanie i konkatenacja lańcuchów znaków

Metoda Concat dodaje do siebie dwa napisy (dopisuje drugi na końcu pierwszego)
i jako wynik zwraca napis bedacy sklejeniem dwóch napisów. Metoda Copy kopiuje

zawartość jednego napisu do drugiego.
Przyk
ladowy kod VB.NET
Przyk
ladowy kod sklejajacy dwa napisy:

Sub Main ( )
Dim napi s1 As S t r i n g
Dim napi s2 As S t r i n g
napis1 =  abcde 
napis2 =  123 
napis1 = S t r i n g . Concat ( napis1 , napis2 )
Console . WriteLine ( napis1 )
End Sub
Przyk
ladowy kod kopiujacy napis:

Sub Main ( )
Dim napi s1 As S t r i n g
Dim napi s2 As S t r i n g
napis1 =  abcde 
napis2 = S t r i n g . Copy ( n apis 1 )
Console . WriteLine ( napis2 )
End Sub
20
2.1. Lańcuchy znaków w.NET

Przyk
ladowy kod C#
Przyk
ladowy kod sklejajacy dwa napisy:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
s t r i n g napis2 ;
napis1 =  abcd  ;
napis2 =  123  ;
napis1 = s t r i n g . Concat ( napis1 , napis2 ) ;
Console . WriteLine ( napis1 ) ;
}
Przyk
ladowy kod kopiujacy napis:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
s t r i n g napis2 ;
napis1 =  abcde  ;
napis2 = S t r i n g . Copy ( n apis 1 ) ;
Console . WriteLine ( napis2 ) ;
}
2.1.3. Dodawanie, usuwanie oraz zastepowanie ciagów znaków

Metoda Insert wstawia jeden napis wewnatrz drugiego na podanej pozycji. Metoda

Remove usuwa określona ilość znaków zaczynajac od podanej pozycji, a nastepnie

zwraca nowy
lańcuch znaków bedacy wynikiem zastosowanej operacji. Metoda Re-

place zastepuje jeden znak innym (w ca napisie)
lym

Przyk
ladowy kod VB.NET
Metoda Insert
Sub Main ( )
Dim napi s1 As S t r i n g
Dim napi s2 As S t r i n g
napis1 =  abcde 
napis2 =  123 
napis1 = napis1 . I n s e r t ( 2 , napis 2 )
Console . WriteLine ( napis1 )
End Sub
Wynikiem jest wypisanie na konsoli napisu ab123cde.
21
2.1. Lańcuchy znaków w.NET

Metoda Remove
Sub Main ( )
Dim napi s1 As S t r i n g
napis1 =  ab123cde 
napis1 = napis1 . Remove ( 2 , 3)
Console . WriteLine ( napis1 )
End Sub
Wynikiem jest wyświetlenie na konsoli napisu abcd.
Metoda Replace
Sub Main ( )
Dim napi s1 As S t r i n g
napis1 =  ababab 
napis1 = napis1 . Replace (  b  ,  12  )
Console . WriteLine ( napis1 )
End Sub
Wynikiem jest wyświetlenie na konsoli napisu a12a12a12
Przyk
ladowy kod C#
Metoda Insert
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
s t r i n g napis2 ;
napis1 =  abcde  ;
napis2 =  123  ;
napis1 = napis1 . I n s e r t ( 2 , napis 2 ) ;
Console . WriteLine ( napis1 ) ;
}
Wynikiem jest wypisanie na konsoli napisu ab123cde.
Metoda Remove
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
napis1 =  ab123cde  ;
napis1 = napis1 . Remove ( 2 , 3 ) ;
Console . WriteLine ( napis1 ) ;
}
Wynikiem jest wyświetlenie na konsoli napisu abcd.
22
2.1. Lańcuchy znaków w.NET

Metoda Replace
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 ;
napis1 =  ababab  ;
napis1 = napis1 . Replace (  b  ,  12  ) ;
Console . WriteLine ( napis1 ) ;
}
Wynikiem jest wyświetlenie na konsoli napisu a12a12a12
2.1.4. Zmiana wielkości liter
Metoda ToUpper dokonuje konwersji liter w napisie na wielkie, natomiast metoda
ToLower na ma litery.
le
Przyk
ladowy kod VB.NET
dzia metod ToUpper oraz ToLower
lanie
Sub Main ( )
Dim napi s1 As S t r i n g =  abcde 
Dim napi s2 As S t r i n g =  ABCDE
napis1 = napis1 . ToUpper ( )
napis2 = napis2 . ToLower ( )
Console . WriteLine (  ToUpper : {0} , ToLower : {1}  ,
napis1 , n apis 2 )
End Sub
Przyk
ladowy kod C#
dzia metod ToUpper oraz ToLower
lanie
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 =  abcd  ;
s t r i n g napis2 =  ABCD ;
napis1 = napis1 . ToUpper ( ) ;
napis2 = napis2 . ToLower ( ) ;
Console . WriteLine (  ToUpper : {0} , ToLower : {1}  ,
napis1 , na pis 2 ) ;
}
2.1.5. Formatowanie napisów
Przekazujac parametry do metody WriteLine lub bydujac nowy napis korzystajac

z metody Format klasy String możemy dok sprecyzować jaki sposób wyświe-
ladniej
23
2.1. Lańcuchy znaków w.NET

tlania wartości nas interesuje. W poniższej tabeli przedstawiono znaczniki dostepne

przy formatowaniu liczb:
Tabela 2.1.2. Formatowanie liczb
znacznik typ format wynik 1.2345 wynik 12345
c waluta 0:c 1,23 z 12 345,00 z
l l
d dziesietny 0:d System.FormatException 12345

e wyk 0:e 1,234500e+000 1,234500e+004
ladniczy
f kropka dziesietna 0:f 1,23 12345,0

g ogólny 0:g 1,2345 12345
n liczba 0:n 1,23 12 345,00
x szsnastkowy 0:x System.FormatException 3039
Można również tworzyć w wzorce formatowania liczb.
lasne
Tabela 2.1.3. W znaczniki formatowania liczb
lasne
znacznik typ format wynik 1234.56
0 zero lub cyfra 0:00.000 1234,560
# cyfra 0:#.## 1234.56
. kropka dziesietna 0:0.0 1234,6

, separator tysiecy 0:0,0 1 235

2.1.6. Formatowanie daty
Znaczniki definiujace format daty sa zależne od ustawień miedzynarodowych w sys-

temie. Poniższa tabela prezentuje dostepne znaczniki formatowania daty i wynik ich

dzia dla systemu polskiego.
lania
Tabela 2.1.4. Znaczniki formatowania daty
znacznik typ wynik 2006-10-11 0:58:09
d krótki format daty 2006-10-11
D d format daty 10 listopada 2006
lugi
t krótki format godziny 0:58
T d format godziny 0:58:09
lugi
f data i czas 10 listopada 2006 0:58
F data i czas pe 10 listopada 2006 0:58:09
lny
g domyślny format daty 2006-10-11 0:58
G domyślny format daty d 2006-10-11 0:58:09
lugi
M dzień / miesiac 10 listopada

r format zgodny z RFC1123 Fri, 10 Nov 2006 00:58:09 GMT
Y miesiac / rok listopad 2006

24
2.1. Lańcuchy znaków w.NET

Tak jak w przypadku liczb istnieje możliwość zdefiniowania w
lasnego formatu daty
z wykorzystaniem znaczników przedstawionych w poniższej tabeli:
Tabela 2.1.5. Znaczniki formatowania daty
znacznik typ wynik 2006-10-11 22:58:09
dd dzień 10
ddd krótka nazwa dnia Pt
dddd d nazwa dnia piatek
luga

hh godzina 10
GG godzina format 24 22
mm minuty 58
MM miesiac 11

MMM miesiac krótka nazwa lis

MMMM miesiac d nazwa listopad
luga

ss sekundy 09
yy rok 2 cyfry 06
yyyy rok 4 cyfry 2006
: separator np 0:hh:mm:ss 22:58:09
/ separator np 0:dd/MM/yyyy 10-11-2006
Przyk
ladowy kod dla VB.NET
Przyk użycia znaczników formatowania:
lad
Sub Main ( )
Dim l i c z b a As Double = 1234.56
Dim na pis As S t r i n g
Console . WriteLine (  Format l i c z b y 0 : c { 0 : c }  , l i c z b a )
Console . WriteLine (  Format l i c z b y 0 : n { 0 : n}  , l i c z b a )
Console . WriteLine (  Format l i c z b y 0 : f { 0 : f }  , l i c z b a )
Console . WriteLine (  Format l i c z b y 0 : e { 0 : e }  , l i c z b a )
Console . WriteLine (  Format l i c z b y 0 : e {0:##,###.##0} , l i c z b a )
n a pi s = S t r i n g . Format (  { 0 : e }  , l i c z b a )
Console . WriteLine ( n a p is )
Console . WriteLine ( )
Dim data As Date = DateTime . Now
Console . WriteLine (  Format daty 0 : d { 0 : d}  , data )
Console . WriteLine (
 Format daty 0 : dddd MM yyyy : { 0 : dddd MM yyyy}  ,
data )
End Sub
25
2.1. Lańcuchy znaków w.NET

Przyk
ladowy kod dla C#
Przyk użycia znaczników formatowania:
lad
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
double l i c z b a = 1 2 3 4 . 5 6 ;
s t r i n g n a p i s ;
Console . WriteLine (  Format l i c z b y 0 : c { 0 : c }  , l i c z b a ) ;
Console . WriteLine (  Format l i c z b y 0 : n { 0 : n}  , l i c z b a ) ;
Console . WriteLine (  Format l i c z b y 0 : f { 0 : f }  , l i c z b a ) ;
Console . WriteLine (  Format l i c z b y 0 : e { 0 : e }  , l i c z b a ) ;
Console . WriteLine (  Format l i c z b y 0 : e {0:##,###.##0} , l i c z b a ) ;
n a pi s = s t r i n g . Format (  { 0 : e }  , l i c z b a ) ;
Console . WriteLine ( n a p is ) ;
Console . WriteLine ( ) ;
DateTime data = DateTime .Now;
Console . WriteLine (  Format daty 0 : d { 0 : d}  , data ) ;
Console . WriteLine (
 Format daty 0 : dddd MM yyyy : { 0 : dddd MM yyyy}  ,
data ) ;
}
2.1.7. Wycinanie bia znaków
lych
Metoda Trum usuwa bia znaki z poczatku i końca napisu.
le

Przyk
ladowy kod dla VB.NET
Sub Main ( )
Dim na pis As S t r i n g =  Napis 
Console . WriteLine ( n a p is )
n a pi s = n a pi s . Trim ( )
Console . WriteLine ( n a p is )
End Sub
Przyk
ladowy kod dla C#
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g n a p i s =  Napis  ;
Console . WriteLine ( n a p is ) ;
n a pi s = n a pi s . Trim ( ) ;
Console . WriteLine ( n a p is ) ;
}
26
2.1. Lańcuchy znaków w.NET

2.1.8. Dope
lnianie lańcuchów znaków
Dwie metody PadLeft oraz PadRight, moga zostać użyte w celu dope lańcucha
lnienia
znaków, odpowiednio z lewej lub prawej strony. Dzia metod jest takie, że jako
lanie
parametr podawana jest d lańcucha wynikowego oraz znak którym ma zostać
lugość
wype lańcuch, wynikiem dzia jest lańcuch znaków o podanej d
lniony lania lugości
natomiast brakujace elementy zostaja wype podanym znakiem.
lnione

Rys. 2.1.1. Wynik dzia metody PadLeft oraz PadRight
lania
Przyk
ladowy kod dlaVB.NET
Sub Main ( )
Dim napi s1 As S t r i n g =  Napis1 
Dim napi s2 As S t r i n g =  Napis2 
napis1 = napis1 . PadLeft ( 1 5 ,  "  )
napis2 = napis2 . PadRight ( 1 5 ,  "  )
Console . WriteLine ( napis1 )
Console . WriteLine ( napis2 )
End Sub
Przyk
ladowy kod dlaC#
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g napis1 =  Napis1  ;
s t r i n g napis2 =  Napis2  ;
napis1 = napis1 . PadLeft ( 1 5 ,  "  ) ;
napis2 = napis2 . PadRight ( 1 5 ,  "  ) ;
Console . WriteLine ( napis1 ) ;
Console . WriteLine ( napis2 ) ;
}
Zauważmy, że w odróżnieniu od VB.NET w przypadku C# drugi parametr metod
Pad zawierajacy znak przekazywany jest nie w cudzys  , ale pomiedzy znakami
lowie

apostrofu (jest to informacja, że wartość jest typu char).
27
2.1. Lańcuchy znaków w.NET

2.1.9. KlasaStringBuilder
KlasaStringBuilderreprezentuje zmienny lańcuch znaków. Może on być modyfi-

kowany przy pomocy metodAppend,Insert,RemoveorazReplace.
Kiedy budujemy napis wykonujac wiele różnych operacji np konkatenacji, zamia-

ny znaków, ze wzgledów wydajności lepiej jest stosować jest klaseStringBuilder

zamiast klasyString.
KlasaStringBuilderjest zdefiniowana w przestrzeni nazwSystem.Text.
Tabela 2.1.6. W
laściwości klasyStringBuilder
W
laściwość Opis
Capacity Reprezentuje maksymalna ilość znaków,
która może być przechowywana
Chars Znak na określonej pozycji
Length Ilość znaków
MaxCapacity Zwraca maksymalna pojemność
Tabela 2.1.7. Metody klasyStringBuilder
Metoda Opis
Append Dopisuje
lańcuch znaków na końcu
AppendFormat Dopisuje sformatowany
lańcuch znaków na końcu
EnsureCapaciry Ustawienie pojemności
Append Dopisuje
lańcuch znaków na końcu
Insert Wstawia lańcuch znaków na podanej pozycji

Remove Usuwa zakres znaków z lańcucha

Replace Zastepuje wszystkie wystapienia znaku innym

Rys. 2.1.2. Wynik dzia programu korzystajacego z klasyStringBuilder
lania

28
2.1. Lańcuchy znaków w.NET

Przyk
ladowy kod dlaVB.NET
Imports System . Text
Module Module1
Sub Main ( )
Dim b u i l d e r As S t r i n g B u i l d e r
b u i l d e r = New S t r i n g B u i l d e r (  Napis testowy !  , 20)
Dim cap As I n t e g e r = b u i l d e r . EnsureCapacity ( 5 5 )
b u i l d e r . Append (  . Test k l a s y .  )
Console . WriteLine ( b u i l d e r )
b u i l d e r . I n s e r t ( 2 7 ,  S t r i n g B u i l d e r  )
Console . WriteLine ( b u i l d e r )
b u i l d e r . Remove ( 5 , 8)
Console . WriteLine ( b u i l d e r )
b u i l d e r . Replace (  !  ,  ?  )
Console . WriteLine ( b u i l d e r )
Console . WriteLine ( )
Console . WriteLine (  Dlugość napisu : {0}  ,

b u i l d e r . Length . ToString ( ) )
Console . WriteLine (  Pojemność bufora : {0}  ,
b u i l d e r . Capacity . ToString ( ) )
End Sub
End Module
Przyk
ladowy kod dlaC#
u s i ng System . Text ;
. . .
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
S t r i n g B u i l d e r b u i l d e r ;
b u i l d e r = new S t r i n g B u i l d e r (  Napis testowy !  , 2 0 ) ;
i n t cap = b u i l d e r . EnsureCapacity ( 5 5 ) ;
b u i l d e r . Append (  . Test k l a s y .  ) ;
Console . WriteLine ( b u i l d e r ) ;
b u i l d e r . I n s e r t ( 2 7 ,  S t r i n g B u i l d e r  ) ;
Console . WriteLine ( b u i l d e r ) ;
b u i l d e r . Remove ( 5 , 8 ) ;
Console . WriteLine ( b u i l d e r ) ;
b u i l d e r . Replace (  !  ,  ?  ) ;
Console . WriteLine ( b u i l d e r ) ;
Console . WriteLine ( ) ;
Console . WriteLine (  Dlugość napisu : {0}  ,

b u i l d e r . Length . ToString ( ) ) ;
Console . WriteLine (  Pojemność bufora : {0}  ,
b u i l d e r . Capacity . ToString ( ) ) ;
}
29
2.2. Petle

2.2. Petle

Petle sa przydatnymi konstrukcjami jezyka, szczególnie kiedy trzeba wykonać pew-

ne zadanie iteracyjne, powtórzyć wykonanie pewnego fragmentu kodu kilkakrotnie
(zazwyczaj d momentu aż nie zostanie spe pewien warunek).
lniony
Najbardziej typowym i spotykanym rodzajem petli jest konstrukcjafor

2.2.1. KonstrukcjaFor...NextVB.NET
Typowe zastosowanie konstrukcjiForw jezykuVB.NET

For = s t a r t To k o n i e c Step

Next
Gdzie zmienna typu liczbowego reprezentujaca licznik petli zwiekszany

w każdym kroku domyślnie o jeden,start wartość poczatkowa,koniec wartość

końcowa,krok wartość o jaka bedzie zwiekszony licznik.

przyk programu wyświetlajacego na konsoli liczby kolejno od jeden do dziesieć:
lad

Sub Main ( )
Dim i As I n t e g e r
For i = 1 To 10
Console . WriteLine ( i )
Next
End Sub
Program wyświetlajacy liczby od dziesieć do jeden:

Sub Main ( )
Dim i As I n t e g e r
For i = 10 To 1 Step -1
Console . WriteLine ( i )
Next
End Sub
W pierwszym przyk zmiennaitypuIntegerinicjalizowana jest wartościa 1,
ladzie
nastepnie wykonywany jest blok znajdujacy sie wewnatrz instrukcjiFor, po wyko-

naniu bloku testowany jest warunek osiagniecia przez zmienna iwartości wiekszej

od 10, jeżeli warunek nie jest spe zmiennaizwiekszana jest o jeden (w tym
lniony,

przyk brak s kluczowegoStep) i wykonanie petli jest kontynuowane z nowa
ladzie lowa

wartościa zmienneji.
W drugim przyk zmiennaitypuIntegerinicjalizowana jest wartościa 10, na-
ladzie
stepnie wykonywany jest blok znajdujacy sie wewnatrz instrukcjiFor, po wykonaniu

bloku testowany jest warunek osiagniecia przez zmienna iwartości mniejszej od 1,

30
2.2. Petle

jeżeli warunek nie jest spe zmiennaizmniejszana jest o jeden (w tym przy-
lniony,
k wartość -1 wystepujaca po s
ladzie lowieStepmówi o ile zmienić wartość zmiennej

i), wykonanie petli jest kontynuowane z nowa wartościa zmienneji.

Istnieje możliwość opuszczenia petli zanim wartość zmiennejiosiagnie wartośćko-

niec, s do tego instrukcjaExit For(jest to jednak ma elegancki sposób pro-
luży lo
gramowania i należy unikać tej konstrukcji, ponieważ petla for wyraża akcje która

wykonujemy za z góry ilość razy i wszelkie sztuczne przerywanie jej dzia
lożona lania

oznacza, że powinniśmy zastosować w tym miejscu inna konstrukcje petli).

Przyk zastosowania instrukcjiExit For
lad
Sub Main ( )
Dim i As I n t e g e r
For i = 1 To 10
I f i > 5 Then
Exit For
End I f
Console . WriteLine ( i )
Next
End Sub
2.2.2. KonstrukcjaforC#
Ogólnych schemat konstrukcjifordla jezykaC#:

f o r ( ; ; )
{

}
Konstrukcjafordla jezykaC#jest znacznie bardziej rozbudowana niż w przypadku

VB.NET.
 opcjonalna zmienna, która może być potraktowana jako licznik
petli tak jak w przypadkuVB.NET(może w tym miejscu może wystapić deklaracja

zmiennej),  wyrażenie, które zwraca wartość logiczna (zwracana
wartośćfalseoznacza koniec wykonania petli),  wyrażenie zwiek-

szajace licznik petli.

31
2.2. Petle

Najlepiej zilustrować konstrukcjeforjezykaC#na przyk kodu, proste i oczy-
ladzie

wiste zastosowanie konstrukcjifordo wypisania kolejnych liczb od 1 do 10 wersja
pierwsza:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i ;
f o r ( i =1; i <=10; i ++)
{
Console . WriteLine ( i ) ;
}
}
Ponieważ może być wyrażeniem zawierajacym deklaracje zmiennej,

możemy zapisać kod wyświetlajacy kolejne liczby w nastepujacy sposób:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
f o r ( i n t i =1; i <=10; i ++)
{
Console . WriteLine ( i ) ;
}
}
Teraz zmiennaijest zadeklarowana jako lokalna wewnatrz petlifor, próba odwo
la-

nia sie do niej poza petla zakończy sie b edem informujacym o tym, że nazwainie
l

istnieje w bieżacym kontekście (jest dostepna tylko wewnatrz petli).

Ponieważ wszystkie sk konstrukcjiforsa opcjonalne nasz przyk możemy
ladowe lad
zapisać jeszcze w inny sposób:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i =1;
f o r ( ; i <=10; i ++)
{
Console . WriteLine ( i ) ;
}
}
Iterator petli jest też opcjonalny, możemy zapisać kod jeszcze w inny

sposób:
32
2.2. Petle

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i =1;
f o r ( ; i <=10; )
{
Console . WriteLine ( i ) ;
i ++;
}
}
lub:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i =1;
f o r ( ; i <=10; )
{
Console . WriteLine ( i ++);
}
}
Ponieważ wszystkie parametry konstrukcjiforsa opcjonalne możemy napisać wersje

petliforw nastepujacy sposób:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i =1;
f o r ( ; ; )
{
Console . WriteLine ( i ++);
}
}
Program ten spowoduje wykonanie petli nieskończonej!, brak wyrażenia
nek opc> powoduje, że warunek jest zawsze prawdziwy i wykonuja sie kolejne ite-

racje.
Zagadka. Co bedzie wynikiem wykonania nastepujacego kodu:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i = 1 ;
f o r ( s t r i n g a= a  ; i <=10; )
{
Console . WriteLine ( a+=i ++);
}
}
33
2.2. Petle

Wynik bedzie nastepujacy:

Rys. 2.2.1. Wynik dzia kodu zagadki
lania
Troche komentarza. Najpierw deklarujemy zmienna ioraz dokonujemy inicjalizacji
tej zmiennej wartościa 1. W petlifordeklarujemy lokalna zmienna atypustring

przypisujac jej wartość w postaci lańcucha znaków zawierajacego jeden znak, miano-


wicie litere a. Warunkiem zakończenia petli jest osiagniecie przez zmienna iwartości

10. Wewnatrz petli wykonywana jest metodaWriteLineklasyConsole, której jako

parametr przekazujemy wyrażeniea+=i++operator+=jest operatorem przypisania
(napisx+=1jest równoważny napisowix=x+1, ponieważ kunstrukcjai++powoduje
zwrócenie wartości zmiennejia nastepnie zwiekszenie jej o jeden po prawej stronie

wyrażenia otrzymujemy jako wynik wartość zmienneji(w pierwszym kroku petli

bedzie to 1) nastepnie operator+dla zmiennej typustringoznacza operator kon-

katenacji, czyli do lańcucha znaków zawartego w zmiennejazostaje dodany lańcuch

znaków reprezentujacy napisowa reprezentacje liczby bedacej wartościa zmiennej


i(dokonywana jest nie jawna konwersja typuintnastringoperacja ta zawsze jest
dobrze określona nie tak jak w przypadku odwrotnym), nowa wartość zmienneja
zawiera wiec napis  a1 , który wypisywany jest na konsoli, a nastepnie wykonanie

petli jest kontynuowane.

Operator++zawiera dwie formy przyrostkowa, oraz przedrostkowa. Powyższy przy-

k zawiera forme przyrostkowa (konstrukcjai++). Forma przedrostkowa (postaci
lad

++i) powoduje, że najpierw zostanie zwiekszona wartość zmiennejia dopiero potem

zostanie zwrócona jej wartość.
Rys. 2.2.2. Wynik dzia kodu zagadki (++i)
lania
34
2.2. Petle

2.2.3. KonstrukcjaDo While...Loop VB.NET
Ogólna struktura konstrukcjiDo While Loopw jezykuVB.NETwyglada nastepujaco:

Do While

Loop
Blok instrukcji wewnatrz konstrukcjiDo Whilewykonuje sie tak d jak d
lugo lugo

wynikiem wyliczenia wyrażenia logicznego jest wartośćtrue. Kod wypisujacy na

konsoli kolejne liczby od 1 do 10 z wykorzystaniem konstrukcjiDo Whilewyglada

nastepujaco:

Sub Main ( )
Dim i As I n t e g e r = 1
Do While i <= 10
Console . WriteLine ( i )
i = i + 1
Loop
End Sub
2.2.4. KonstrukcjaDo...Loop While VB.NET
Konstrukcja ta jest podobna do konstrukcjiDo While...Loopz ta różnica, że wa-

runek nie jest sprawdzany przed pierwsza iteracja (petla zawsze wykona sie przy-

najmniej jeden raz).
Do

Loop While
Przyk zastosowania konstrukcjiDo...Loop Whiledo wypisania kolejnych liczb
lad
od 1 do 10:
Sub Main ( )
Dim i As I n t e g e r = 1
Do
Console . WriteLine ( i )
i = i + 1
Loop While i <= 10
End Sub
35
2.2. Petle

2.2.5. KonstrukcjaDo...Loop Until VB.NET
KonstrukcjaDo...Loop Untiljest podobna do konstrukcjiDo...Loop Whilez ta
różnica, że instrukcje wewnatrz petli sa wykonywane dopóki warunek logiczny nie

przyjmie wartościtrue. Schemat konstrukcjiDo...Loop Until:
Do

Loop U n t i l
Przyk zastosowania konstrukcjiDo...Loop Untildo wypisania kolejnych liczb
lad
od 1 do 10:
Sub Main ( )
Dim i As I n t e g e r = 1
Do
Console . WriteLine ( i )
i = i + 1
Loop U n t i l i > 10
End Sub
Tak jak w przypadku konstrukcjiDo...Loop WhilepetlaDo...Loop Untilwyko-

nuje sie przynajmniej raz.

2.2.6. Konstrukcjawhile C#
Struktura konstrukcjiwhile
w h i l e ()
{
;
}
Przyk zastosowania konstrukcjiwhilewypisujacy kolejne liczby od 1 do 10:
lad

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i = 0 ;
w h i l e ( i <= 10)
{
Console . WriteLine ( i ) ;
i = i + 1 ;
}
}
36
2.2. Petle

Przyjrzyjmy sie innemu zapisowi powyższego programu:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i = 0 ;
w h i l e ( i++ < 10)
{
Console . WriteLine ( i ) ;
}
}
Najpierw inicjalizujemy zmienna iwartościa zero, pierwsze wykonanie petli wylicza

wyrażenie logicznei++<10, ponieważ konstrukcjai++zwraca wartość zmiennejia
nastepnie dokonuje inkrementacji zmiennejiwykonywane jest porównanie0<10w
wyniku otrzymujemy wartośćtruenastepnie zmiennaijest zwiekszana o jeden i

w tym momencie ma wartość 1. InstrukcjaConsole.WriteLine(i)wypisuje wiec

napis 1. Na koniec kiedy zmiennaima wartość 9 wyrażenie logicznei<10jest
dalej spe czyli wykonywana jest najpierw inkrementacja zmienneji, zmienna
lnione
iposiada teraz wartość 10, zostaje wypisana na ekran i w kolejnym kroku petli

waruneki<10jest już fa ponieważ zmiennaima wartość 10.
lszywy
2.2.7. Konstrukcjado...while C#
Struktura konstrukcjido...while
do
{
;
} w hi l e ();
Przyk zastosowania konstrukcjido...whilewypisujacy kolejne liczby od 1 do
lad

10:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t i = 1 ;
do
{
Console . WriteLine ( i ) ;
i = i + 1 ;
} w h i l e ( i <= 1 0 ) ;
}
Oczywiście w tym przypadku możemy też skorzystać z operatora++.
37
Rozdzia 3
l
Laboratorium 3
3.1. Tablice
Tablica jest struktura danych zawierajaca zmienne tego samego typu.CLRśrodowiska

.NET Frameworkwspiera tworzenie tablic jedno oraz wielo wymiarowych.
3.1.1. Tablice wVB.NET
Każda tablicaVB.NETjest obiektem dziedziczacym z klasySystem.Array. Tablice

deklaruje sie w nastepujacy sposób:

Dim () As
Deklaracja tablicy do przechowania 10 wartości typuInteger:
Dim t a b l i c a L i c z b C a l k o w i t y c h ( 9 ) As i n t e g e r
Powyższy fragment kodu deklaruje tablice mogaca przechować 10 wartości typuIn-

teger, elementy tablicy indeksowane sa od 0 do 9. W tym przypadku rozmiar tablicy
jest sta i zosta podany w nawiasach przy deklaracji zmiennej typu tablicowego.
ly l
Możemy również zadeklarować zmienna tablicowa bez podawania jej rozmiaru, roz-
miar zostanie ustalony podczas inicjalizacji tablicy:
Dim tab ( ) As I n t e g e r
tab = New I n t e g e r ( ) {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}
38
3.1. Tablice
Powyższy kod deklaruje najpierw zmienna tabjako tablice liczb typuInteger, na-

stepnie w nawiasach klamrowych wystepuja oddzielone przecinkami kolejne elementy

tablicy.
Kiedy deklaracja i inicjalizacja tablicy sa rozdzielone, inicjalizacje trzeba wykonać

podajac w nawiasach klamrowych elementy tablicy.

Odwo sie do elementu tablicy odbywa sie poprzez operator indeksowania(i)
lanie

gdzieioznacza indeks elementu tablicy do którego chcemy sie odwo Pamietajmy,
lać.

że indeks pierwszego elementu to 0
Przyk
ladowy program korzystajacy z tablicy:

Sub Main ( )
Dim i As I n t e g e r = 0
Dim tab ( ) As I n t e g e r
tab = New I n t e g e r ( ) {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}
For i = 0 To 9
Console . WriteLine ( tab ( i ) )
Next
End Sub
Powyższy program jest dość prosty, ale musieliśmy na sztywno umieścić rozmiar
tablicy w petliFor. Wcześniej wspomnieliśmy, że wszystkie klasy.NET Framework

dziedzicza z klasySystem.Array, w której znajduje sie wiele przydatnych metod

i w laściwości klasy System.Array jest
laściwości. jedna z bardzo przydatnych w
Lengthgdzie przechowywana jest informacja o rozmiarze tablicy. Możemy napisać
kod dla powyższego przyk zastepujac sztywny rozmiar tablicy użyty w petliFor
ladu

odwo do w
laniem laściwościLength
Sub Main ( )
Dim i As I n t e g e r = 0
Dim tab ( ) As I n t e g e r
tab = New I n t e g e r ( ) {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10}
For i = 0 To tab . Length - 1
Console . WriteLine ( tab ( i ) )
Next
End Sub
Ponieważ w
laściwośćLengthzawiera rozmiar tablicy a elementy indeksowane sa od
0, w petli for pojawia sieLength - 1

Możemy teraz zaprezentować inna forme funkcjiMainod której rozpoczyna sie wy-

konanie aplikacji konsolowej napisanej w jezykuVB.NET.

Sub Main ( ByVal a r g s As S t r i n g ( ) )
End Sub
39
3.1. Tablice
Zauważmy, że proceduraMainposiada parametr o nazwieargs(nazwa zmiennej
może być dowolna) typu tablica wartości typuString. Dodatkowo pojawi sie s
lo lowo

kluczoweByVal, które zostanie omówione pózniej.
Zmiennaargsbedzie zawiera parametry przekazane naszej aplikacji z linii poleceń.
la

Możemy napisać program, który wyświetli wszystkie parametry z jakimi zosta
la
wywo nasza aplikacja:
lana
Sub Main ( ByVal a r g s As S t r i n g ( ) )
Dim i As I n t e g e r
For i = 0 To a r g s . Length - 1
Console . WriteLine ( a r g s ( i ) )
Next
End Sub
Powyższy przyk wykorzystuje petle typuFor. JezykVB.NETposiada jednak wy-
lad

godniejsza konstrukcje do iteracji poprzez elementy tablicy, mianowicie konstrukcje

For Each
For Each In

Next
Zamieńmy kod wyświetlajacy elementy tablicy tak, aby wykorzystywa konstrukcje
l

For Each:
Sub Main ( )
Dim tab As I n t e g e r ( )
tab = New I n t e g e r ( ) {1 , 2 , 3 , 4 , 5}
Dim i As I n t e g e r
For Each i In tab
Console . WriteLine ( i )
Next
End Sub
Zmiennaiw każdej iteracji zawiera wartość kolejnego elementu tablicytab. Zmienna
imusi być tego samego typu co elementy tablicy (w naszym przypadkuInteger).
" Zmiennaimoże być wykorzystana tylko do odczytania wartości elementu tablicy,
nie można przy jej pomocy zmienić zawartości tablicy. Jeżeli zachodzi konieczność
modyfikacji elementów tablicy podczas iteracji trzeba skorzystać z konstrukcji
For...Next,
" KonstrukcjaFor Eachs do iteracji po elementach tablicy jak i kolekcji. Po-
luży
jecie kolekcji zostanie omówione pózniej,

" KlasaStringjest także kolekcja znaków.
Możemy zastosować konstrukcjeFor Eachdo iteracji poprzez kolejne znaki wchodza-

ce w sk lańcucha znaków. Poniższy program wypisuje poszczególne litery wcho-
lad
dzace w sk napisu:
lad

40
3.1. Tablice
Sub Main ( )
Dim na pis As S t r i n g =  J a k i ś na pi s 
Dim c As Char
For Each c In n ap i s
Console . WriteLine ( c )
Next
End Sub
Poniższy kod pokazuje zastosowanie tablicy tablic, do wyświetlenia kalendarza.
1 Sub Main ( )
2 Dim i As I n t e g e r
3 Dim M i e s i a c e ( ) , Dni ( ) As S t r i n g
4 Dim Kalendarz ( ) ( ) As I n t e g e r = New I n t e g e r ( 1 1 ) ( ) {}
5 Dim Miesiac , Dzien As I n t e g e r
6 M i e s i a c e = New S t r i n g ( 1 1 ) {  Styczeń  ,  Luty  ,  Marzec  ,
7  Kwiecień  ,  Maj  ,  Czerwiec  ,
8  L i p i e c  ,  S i e r p i e ń  ,  Wrzesień  ,
9  P a z d z i e r n i k  ,  L i s t o p a d  ,  Grudzień  }
10 Dni = New S t r i n g ( 6 ) {  Pn ,  Wt ,  Śr  ,  Cz  ,
11  Pt  ,  So  ,  Nie  }
12 For M i e s i a c = 0 To M i e s i a c e . Length - 1
13 Dzien = DateTime . DaysInMonth ( Year (Now) , M i e s i a c + 1)
14 Kalendarz ( M i e s i a c ) = New I n t e g e r ( Dzien - 1) {}
15 For i = 0 To Dzien - 1
16 Kalendarz ( M i e s i a c ) ( i ) = i + 1
17 Next i
18 Next M i e s i a c
19 Dim d As DateTime
20 For M i e s i a c = 0 To M i e s i a c e . Length - 1
21 Console . WriteLine ( M i e s i a c e ( M i e s i a c ) )
22 d = New DateTime ( Year (Now) , M i e s i a c + 1 , 1)
23 i = d . DayOfWeek  0 - nd , 1 - pn . . .
24 I f ( i = 0) Then
25 i = 6
26 E l s e
27 i = i - 1
28 End I f
29 For Dzien = 0 To Dni . Length - 1
30 Console . Write (  {0}  , Dni ( Dzien ) )
31 Next
32 Console . WriteLine ( )
33 For Dzien = 0 To i - 1
34 Console . Write (   . PadRight ( 3 ) )
35 Next
36 For Dzien = 0 To Kalendarz ( M i e s i a c ) . Length - 1
37 Console . Write (  { 0 : 0 0 }  , Kalendarz ( M i e s i a c ) ( Dzien ) )
38 I f ( i + 1) Mod 7 = 0 Then
39 Console . WriteLine ( )
40 End I f
41 i = i + 1
42 Next Dzien
43 Console . WriteLine ( )
44 Console . WriteLine ( )
45 Next M i e s i a c
46 End Sub
41
3.1. Tablice
3.1.2. Tablice wC#
Każda tablicaC#jest obiektem dziedziczacym z klasySystem.Array. Tablice dekla-

ruje sie w nastepujacy sposób:

[] ;
Deklaracja tablicy do przechowania 10 wartości typuInteger:
i n t [ 1 0 ] t a b l i c a L i c z b C a l k o w i t y c h ;
Powyższy fragment kodu deklaruje tablice mogaca przechować 10 wartości typuIn-

teger, elementy tablicy indeksowane sa od 0 do 9. W tym przypadku rozmiar tablicy
jest sta i zosta podany w nawiasach przy deklaracji zmiennej typu tablicowego.
ly l
Podawanie rozmiaru w deklaracji tablicy różni sie w jezykuC#w stosunku d jezy-

kaVB.NET. Deklarujac tablice wVB.NETpodawaliśmy maksymalny indeks tablicy,

natomiast wC#podajemy ilość elementów.
Tak jak w przypadkuVB.NETmożemy zadeklarować tablice bez podawania jej roz-

miaru, a nastepnie dokonać jej inicjalizacji:

i n t [ ] tab ;
tab = new i n t [ 1 0 ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 } ;
Możemy również utworzyć tablice dynamicznie nie inicjalizujac jej:

i n t [ ] tab ;
tab = new i n t [ 1 0 ] ;
Operatorem indeksowania w przypadkuC#jest operator []. przyk
ladowy program
deklaruje zmienna tabjako tablice liczb typuint, nastepnie tworzy nowy obiekt

reprezentujacy tablice i wype elementy tablicy kolejnymi liczbami by na końcu
lnia

używajac petliforwyświetlić zawartość tablicy:

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i n t [ ] tab ;
tab = new i n t [ 1 0 ] ;
f o r ( i n t i =0; i tab [ i ]= i +1;
f o r ( i n t i = 0 ; i < tab . Length ; i ++)
Console . WriteLine ( tab [ i ] ) ;
}
42
3.1. Tablice
Tak samo jak w przypadkuVB.NETw jezykuC#istnieje konstrukcjaforeachs
lużaca

do wykonania operacji iteracji na elementach tablicy lub kolekcji.
f o r e a c h ( i n )

Analogiczny kod jak w przypadkuVB.NETużywajacy konstrukcjiforeach

s t a t i c void Main ( s t r i n g [ ] a r g s )
{
s t r i n g s =  J a k i ś n a p i s  ;
f o r e a c h ( char c i n s )
Console . WriteLine ( c ) ;
}
Zauważmy, że deklaracja funkcjiMainjezykaC#od której rozpoczyna sie wykonanie

aplikacji konsolowej, zawiera argument o nazwieargstypustring[].
Tak jak w przypadkuVB.NETjest to tablica lańcuchów znaków zawierajaca parame-


try przekazane w linii poleceń podczas uruchamiania programu.
Przyk
ladowy kod wykorzystuje petleforeachdo wyświetlenia parametrów przeka-

zanych z linii poleceń:
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
i f ( a r g s . Length < 1)
Console . WriteLine (  Brak parametró wywolania !  ) ;

e l s e
{
Console . WriteLine (  Przekazana parametry :  ) ;
f o r e a c h ( s t r i n g c i n a r g s )
{
Console . WriteLine ( c ) ;
} // f o r e a c h
} // e l s e
}//Main
Tablice wielowymiarowe deklaruje sie podobnie do tablic jednowymiarowych:

i n t [ , ] tablica2Wymiarowa ;
tablica2Wymiarowa = new i n t [ 1 0 , 1 0 ] ;
43
3.1. Tablice
Kod wykorzystujacy tablice tablic:

1 s t a t i c void Main ( s t r i n g [ ] a r g s )
2 {
3 i n t Dzien , Miesiac , i ;
4 s t r i n g [ ] Mi e si a c e , Dni ;
5 i n t [ ] [ ] Kalendarz = new i n t [ 1 2 ] [ ] ;
6 M i e s i a c e = new s t r i n g [ 1 2 ] {  Styczeń  ,  Luty  ,  Marzec  ,  Kwiecień  ,
7  Maj  ,  Czerwiec  ,  L i p i e c  ,  S i e r p i e ń  ,
8  Wrzesień  ,  P a z d z i e r n i k  ,  Li s t o p a d  ,
9  Grudzień  } ;
10 Dni = new s t r i n g [ 7 ] {  Pn ,  Wt ,  Śr  ,  Cz  ,  Pt  ,  So  ,  Nie  } ;
11 f o r ( M i e s i a c = 0 ; M i e s i a c < M i e s i a c e . Length ; M i e s i a c++)
12 {
13 Dzien = DateTime . DaysInMonth ( DateTime . Now . Year , M i e s i a c + 1 ) ;
14 Kalendarz [ M i e s i a c ] = new i n t [ Dzien ] ;
15 f o r ( i = 0 ; i < Dzien ; i ++)
16 Kalendarz [ M i e s i a c ] [ i ] = i + 1 ;
17 } // f o r M i e s i a c
18 f o r ( M i e s i a c = 0 ; Miesiac < M i e s i a c e . Length ; M i e s i a c++)
19 {
20 Console . WriteLine ( M i e s i a c e [ M i e s i a c ] ) ;
21 DateTime d = new System . DateTime ( DateTime . Now . Year , M i e s i a c + 1 , 1 ) ;
22 i = ( i n t ) d . DayOfWeek ;
23 i = i == 0 ? 6 : i -1;
24 // 0 - nd , 1 - pn . . .
25 f o r ( Dzien = 0 ; Dzien < Dni . Length ; Dzien++)
26 Console . Write (  {0}  , Dni [ Dzien ] ) ;
27 Console . WriteLine ( ) ;
28 Console . Write (   . PadRight (3" i ) ) ;
29 f o r ( Dzien = 0 ; Dzien < Kalendarz [ M i e s i a c ] . Length ; Dzien++)
30 {
31 Console . Write (  { 0 : 0 0 }  , Kalendarz [ M i e s i a c ] [ Dzien ] ) ;
32 i f ( ( i++ + 1) % 7 == 0)
33 Console . WriteLine ( ) ;
34 }
35 Console . WriteLine ( ) ;
36 Console . WriteLine ( ) ;
37 } // f o r M i e s i a c
38 } // Main
Rys. 3.1.1. Wynik dzia programu
lania
44
3.2. Funkcje matematyczne
3.2. Funkcje matematyczne
Poza podstawowymi operacjami matematycznymi, platforma .NET Framework po-
siada bibliotekeMathpozwalajaca na wykorzystanie bardziej z
lożonych funkcji ma-

tematycznych.
Poniższa tabelka zawiera zestaw funkcji matematycznych:
Tabela 3.2.1. Funkcje matematyczne
funkcja użycie
Math.Abs() zwraca wartość bezwzgledna z liczby

Math.Abs(-10) zwraca 10
Math.Ceiling() sufit z liczby
Math.Ceiling(4.56) zwraca 5
Math.Floor() pod z liczby
loga
Math.Floor(4.56) zwraca 4
Math.Max() zwraca wieksza z liczb

Math.Max(4,2) zwraca 4
Math.Min() zwraca mniejsza z liczb
Math.Min(4,2) zwraca 2
Math.Pow() zwraca liczbe podniesiona do potegi

Math.Pow(2,3) zwraca 23 czyli 8
Math.Round() zaokragla liczbe do podanej liczby miejsc

Math.Round(1.23456,3) zwraca 1.235
Math.Sign() zwraca znak liczby
Math.Sign(-4) zwraca -1
Math.Sqrt() pierwiastek kwadratowy z liczby
Math.Sqrt(4) zwraca 2
3.3. Obs wyjatków
luga

Obs wyjatków jest mechanizmem wbudowanym w platforme .NET Framework,
luga

pozwala na wykrycie oraz obs
lużenie wyjatków wystepujacych w aplikacji podczas

wykonania.
Wyjatki moga być spowodowane b edami w kodzie programu, lub moga być zg
l laszane

przez system operacyjny np nie znaleziono pliku, który program chce otworzyć.
Platforma .NET Framework zawiera domyślny mechanizm obs wyjatków, prze-
lugi

rywajac wykonywanie programu i zg
laszajac wystapienie wyjatku.

Brak obs wyjatków w aplikacji nie jest wiec eleganckim sposobem programowa-
lugi

nia, użytkownik oczekuje od aplikacji tego, że nawet w sytuacji wystapienia jakiegoś

b edu program pozwoli na bezpieczne zakończenie jego pracy i np, zapisani wyników
l
dotychczasowej pracy.
45
3.3. Obs luga wyjatków

3.3.1. WyjatkiVB.NET

JezykVB.NETdostarcza konstrukcje do obs wyjatków:
lugi

Try

Catch e As

F i n a l l y

End Try
Jeżeli wystapi wyjatek w blokuTrysterowanie przenoszone jest do blokuCatchna

końcu niezależnie od tego czy wystapi wyjatek czy nie, wykonywane sa instrukcje
l

zawarte w blokuFinally.
BlokiCatchorazFinallysa opcjonalne w jezykuVB.NETale przynajmniej jeden z

bloków musi wystapić.

Sub Main ( )
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim wynik As I n t e g e r
l i c z b a 1 = 10
l i c z b a 2 = 0
Try
wynik = l i c z b a 1 / l i c z b a 2
Console . WriteLine ( wynik )
Catch
Console . WriteLine (  bla d !  )

End Try
End Sub
Powyższy kod wykonuje w blokuTryinstrukcje powodujaca wygenerowanie wyjatku

dzielenia przez zero. Jeżeli program nie zawiera blokuTryjego wykonanie zosta
lby lo-
by przerwane z komunikatem zg
laszajacym wystapienie wyjatku. Kod zawiera jednak

blokTryw momencie wystapienia wyjatku sterowanie zostanie przeniesione do bloku

Catchi zostanie wypisany napis b ad, a program bedzie kontynuowa dzia
l l lanie.

Powyższy kod nie zawiera jednak informacji na temat wyjatku jaki wystapi wiemy
l,

tylko że mia miejsce wystapienie wyjatku i możemy poinformować użytkownika o
lo

wystapieniu jakiegoś b edu, ale nie możemy go sprecyzować.
l

Przyjrzyjmy sie zmodyfikowanej wersji kodu:

46
3.3. Obs luga wyjatków

Sub Main ( )
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim wynik As I n t e g e r
l i c z b a 1 = 10
l i c z b a 2 = 0
Try
wynik = l i c z b a 1 / l i c z b a 2
Console . WriteLine ( wynik )
Catch e As Exception
Console . WriteLine ( e . Message )
End Try
End Sub
Pojawi sie dodatkowy kod w blokuCatchmianowicie wyglada on terazCatch e
l

As Exception, można go potraktować jako zadeklarowanie zmiennej e typuExcep-
tion, w momencie kiedy wystapi wyjatek zmienna e bedzie zawiera dodatkowe
la

informacje na temat wyjatku.

Exceptionjest obiektem reprezentujacym dowolny wyjatek jaki może wystapić. Pro-

cedure obs wyjatków możemy skonstruować w bardziej dok sposób rozpa-
lugi ladny

trujac jakie typy wyjatków chcemy obs i w jaki sposób.
lużyć

Sub Main ( )
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim wynik As I n t e g e r
l i c z b a 1 = 10
l i c z b a 2 = 0
Try
wynik = l i c z b a 1 / l i c z b a 2
Console . WriteLine ( wynik )
Catch e As OverflowException
Console . WriteLine ( e . Message )
Catch ee As Exception
Console . WriteLine (  w y s t a p i l wyja tek  )

End Try
End Sub
Operacja dzielenia przez zero liczby ca
lkowitej spowoduje wygenerowanie wyjatku

OverflowException, wykona sie wiec instrukcjaConsole.WriteLine(e.Message),

gdyby jednak zastapić instrukcje dzielenia jakimś innym kodem powodujacym po-

wstanie wyjatku wykona sie blokCatch ee As Exception
lby

Sub Main ( )
Dim l i c z b a 1 As I n t e g e r
Dim wynik As I n t e g e r
l i c z b a 1 = 10
Try
wynik =  abc 
Console . WriteLine ( wynik )
Catch e As OverflowException
Console . WriteLine ( e . Message )
Catch ee As Exception
Console . WriteLine (  w y s t a p i l wyja tek  )

End Try
End Sub
47
3.3. Obs luga wyjatków

Powyższy kod nie wygeneruje wyjatkuOverflowException, lecz wyjatek konwersji

napisu abc na liczbe typuInteger, gdyby zabrak blokuCatch ee As Exception
lo

program zosta przerwany przez domyślna procedure obs wyjatków, ponieważ
lby lugi

wyjatek, który wystapi jest typuInvalidCastException.
l

Podstawowe typy wyjatków:

Tabela 3.3.1. Wyjatki

wyjatek

OutOfMemoryException
NullReferenceException
InvalidCastException
ArrayTypeMismatchException
IndexOutOfRangeException
ArithmeticException
DevideByZeroException
OverFlowException
Generowanie wyjatków

Wyjatki sa dobrym mechanizmem zg l
laszania b edów przez procedury. Zamiast pisać

funkcje która zwraca np. kod reprezentujacy czy wykonanie powiod sie czy nie, a
lo

nastepnie testowania tego kodu, możemy w procedurze lub funkcji w przypadku nie-

powodzenia wygenerować wyjatek, który w cześci kodu wywo
lujacym dana funkcje

lub procedure wykorzysta blokTry.

Sub Main ( )
Try
ProceduraTestowa ( )
Catch e As Exception
Console . WriteLine ( e . Message )
End Try
End Sub
Sub ProceduraTestowa ( )
Throw New DivideByZeroException (  d z i e l e n i e p r z e z z e r o !  )
End Sub
Popatrzy ma troche zmodyfikowany kod:
48
3.3. Obs luga wyjatków

Sub Main ( )
Try
ProceduraTestowa ( )
Catch e As Exception
Console . WriteLine ( e . Message )
End Try
End Sub
Sub ProceduraTestowa ( )
Dim l i c z b a As I n t e g e r
Try
l i c z b a =  aaa 
Catch ex As Exception
Console . WriteLine (  Wyja tek !  )
Throw
End Try
End Sub
ProceduraMainwywo procedureProceduTatestowa, która w wyniku swojego
luje

dzia powoduje powstanie wyjatku, zawiera ona jednak blokTrygdzie wyjatek
lania

jest obs lużeniu wyjatku korzysta z instrukcjiThrowdo
lugiwany, natomiast po obs

przekazania informacji o wyjatku wyżej, czyli do miejsca gdzie zosta wywo
la lana,

w naszym przypadku blokTryproceduryMain. Możemy teraz w procedurzeMain
obs jeszcze raz ten wyjatek, który powsta w wyniku wykonania procedury
lużyć l

ProceduraTestowa.
3.3.2. WyjatkiC#

Ponieważ jezyk C# jest jezykiem platformy .NET, również dostepny jest w nim

mechanizm obs wyjatków. Tak samo jak w przypadkuVB.NETfragment kodu
lugi

powodujacy wystapienie wyjatku, jeżeli nie zostanie ujety w bloktryspowoduje

domyślna obs wyjatku, która doprowadzi do przerwania wykonywania aplikacji.
luge

Ogólna struktura konstrukcjitrydlaC#wyglada nastepujaco:

t r y
{

}
ca tc h ( )
{

}
f i n a l l y
{

}
Tak jak w przypadkuVB.NETblokicatchorazfinallysa opcjonalne, ale musi
wystapić przynajmniej jeden z nich.

Przyk luga
ladowy program z obs wyjatków:
49
3.3. Obs luga wyjatków

s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
i n t l i c z b a 1 = 10 , l i c z b a 2 = 0 ;
i n t wynik ;
t r y
{
wynik = l i c z b a 1 / l i c z b a 2 ;
}
c a t c h ( Exception e )
{
Console . WriteLine ( e . Message ) ;
}
}
Tak jak w przypadkuVB.NETmożemy generować wyjatki programistycznie:

c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
t r y
{
ProceduraTestowa ( ) ;
}
ca tc h ( Exception e )
{
Console . WriteLine ( e . Message ) ;
}
}
s t a t i c void ProceduraTestowa ( )
{
throw new
DivideByZeroException (  d z i e l e n i e p r z e z z e r o !  ) ;
}
}
50
Rozdzia 4
l
Laboratorium 4
4.1. Klasy
Klasa jest pewnym abstrakcyjnym modelem używanym do definiowania nowego typu
danych. Klasa może może sk sie z danych, operacji, które można wykonać na
ladać

danych (zwanych metodadmi) oraz w
laściwości (metod dostepu do danych). Jako

przyk możemy pos sie klasa Stringzdefiniowana w przestrzeniwSystem
lad lużyć

biblioteki klas środowiska.NETFramework (FCL).
KlasaStringzawiera tablice znaków (dane) i dostarcza różne operacje (metody),

które moga być wykonane na danych, npToLowerCase(),Trim()itd. Klasa zawiera
też w
laściwości (umożliwiajace dostep do danych) npLength.

Różnica pomiedzy metoda a w
laściwościa polega na tym, że metoda jest funkcja

lub procedura wykonujaca jakieś operacje na danych wchodzacych w sk klasy,
lad

natomiast w la la
laściwość możemy potraktować tak jakby by to zwyk zmienna zde-
finiowana wewnatrz klasy, do której możemy sie odwo (przypisać jej wartość, od-
lać

czytać wartość). Nie wszystkim w laściwości
laściwościa możemy przypisać wartość (w
tylko do odczytu), zależne to jest od tego co autor klasy uzna za stosowne, jeżeli
l
zdefiniowa jaka ś z w
l laściwości jako tylko do odczytu, możemy pobrać jej wartość
natomiast nie możemy jej przypisać. Zostanie to omówione dalej na konkretnych
przyk
ladach.
Klasa jest pewna abstrakcja dancyh. Konkretna realizacja klasy nazywa sieobiek-

tem. Obiekt tworzony jest przy pomocy operatoranew. Zmienna która przechowuje
dane na temat stworzonego obiektu nazywa siereferencja.

Zak
ladajac, że mamy zdefiniowana klase o nazwieKlasaTestowa, stworzenie obiektu

w jezykuVB.NETwyglada nastepujaco:

51
4.1. Klasy
Dim j a k i s O b i e k t As New KlasaTestowa ( )
natomiast wC#
KlasaTestowa j a k i s O b i e k t = new KlasaTestowa ( ) ;
Różnica pomiedzy klasami a bezpośrednimi typami danych jest taka, że objekt

jest typem referencynym (przekazywanym do metod jako referencja) podczas gdy
zmienne typu podstawowego przekazywane sa jako kopia (lepiej bedzie to widać na

przyk
ladach).
Klasa może zawierać dane przechowywane w zmiennych nazywanych polami. Pola
moga być zmiennymi typu podstawowego, lub referencjami do innych obiektów.
Metody z punktu widzenia programisty sa to poprostu funkcje lub procedure zde-
finiowane wewnatrz klasy, wykonujace jakieś operacje na danych klasy. Metoda tak

jak procedura, czy funkcja może posiadać parametry.
Podczas tworzenia obiektu za pomoca operatoranewwywo
lywany jest konstruktor
klasy (wiecej na ten temat dalej na konkretnych przyk
ladach).

4.1.1. Klasy wVB.NET
Klase w jezykuVB.NETdeklarujemy przy pomocy s kluczowegoClassi dekla-
lowa

racje kończymy znacznikiemEnd Class

C l a s s KlasaTestowa
 pola , w l a ś c i w o ś c i , metody

End C l a s s
Metody
W jezykuVB.NETmamy dwa typy metod: procedury oraz funkcje. Różnica pomiedzy

procedura a funkcja jest taka, że procedure deklarujemy używajac s kluczowego
lowa

Sub, natomiast funkcje s kluczowegoFunction. Procedura nie zwraca żadnej
lowa

wartości jako wynik swojego dzia natomiast funkcja zwraca wartość.
lania,
Poniższy fragment kodu przedstawia procedure w jezykuVB.NET

Sub ProceduraTestowa ( )
Console . WriteLine (  proced ura  )
End Sub
Powyższa procedura nie pobiera parametrów, jedyne co robi to wypisuje na konsoli
napis procedura. Oczywiście procedura może pobierać parametry:
52
4.1. Klasy
Sub ProceduraTestowa ( ByVal t e k s t As S t r i n g )
Console . WriteLine (  proced ura : {0}  , t e k s t )
End Sub
Powyższa procedura pobiera jeden parametr o nazwie napis typuString, a nastepnie

wyświetla na konsoli napis bedacy z
lożeniem napisu procedura oraz przekazanego


parametru.
S kluczoweByValoznacza, że parametr bedzie przekazany do procedury przez
lowo

zmienna (zostanie utworzona jego kopia).
Przyjrzyjmy sie fragmentowi kodu:

Sub Main ( )
Dim i As I n t e g e r
i = 2
ProceduraTestowa ( i )
Console . WriteLine ( i )
End Sub
Sub ProceduraTestowa ( ByVal i As I n t e g e r )
i = i + 1
End Sub
W procedurzeMainmamy deklaracje zmiennej i typuInteger, jest to lokalna zmien-

na proceduryMain. ProceduraProceduraTestowapobiera parametr o nazwie i typu
Integerpoprzez wartość (ByVal), zmienna i jest lokalna wewnatrz procedurPro-

ceduraTestowa. Efektem dzia proceduryProceduraTestowajest zwiekszenie
lania

o jeden wartości zmiennej i (lokalnej dla procedury), któa zosta przekazana jako
la
kopia. Po zakończeniu swojego dzia zmienna ta przestaje istnieć. Procedura
lania
Mainwypisze wiec na konsoli wartość 2, ponieważ taka wartość przypisaliśmy do

zmiennej lokalnej i proceduryMain.
Dokonajmy drobnej modyfikacji w kodzie:
Sub Main ( )
Dim i As I n t e g e r
i = 2
ProceduraTestowa ( i )
Console . WriteLine ( i )
End Sub
Sub ProceduraTestowa ( ByRef i As I n t e g e r )
i = i + 1
End Sub
Tym razem proceduraProceduraTestowapobiera parametr nie przez wartość, ale
przez referencje (zmienna), nie jest tworzona kopia tylko przekazywana jest referen-

cja. Można powiedzieć że zmienna i wewnatrz proceduryProceduratestowa po-


kazuje na miejsce w pamieci, gdzie znajduje sie zmienna i proceduryMain. Wy-

konujac wiec operacjei = i + 1, tak naprawde dokonuje modyfikacji zmiennej i

zadeklarowanej w procedurzeMain. Tym razem efektem dzia programu bedzie
lania

wyświetlenie wartości 3.
53
4.1. Klasy
Funkcje
Funkcja nie różni sie zasadniczo od procedury, parametry przekazywane sa w iden-

tyczny sposób. Jedyna różnica polega na tym, że procedura zwraca pewna wartość
(typ zwracanej wartości określany jest w deklaracji funkcji) przy pomocy s klu-
lowa
czowegoReturn
Sub Main ( )
Dim wynik As I n t e g e r
wynik = Suma ( 2 , 4)
Console . WriteLine ( wynik )
End Sub
Function Suma( ByVal l i c z b a 1 As I n t e g e r ,
ByVal l i c z b a 2 As I n t e g e r ) As I n t e g e r
Return l i c z b a 1 + l i c z b a 2
End Function
Powyższy kod zawiera definicje funkcjiSuma, która pobiera dwa parametry typu

liczba ca lania
lkowita i jako wynik dzia zwraca ich sume.

Postarajmy sie teraz zbudować klaseStudent, która bedzie zawiera informacje
la

o studencie, imie, nazwisko, oraz oceny z trzech przedmiotów, bedzie udostepnia
la

metode zwracajaca średnia ocen.

C l a s s Student
Dim oceny ( 2 ) As I n t e g e r
Function S r e d n i a ( ) As Double
Dim suma As I n t e g e r = 0
Dim i As I n t e g e r
For Each i In oceny
suma = suma + i
Next
Return suma / oceny . Length ( )
End Function
Sub WystawOceny ( )
oceny ( 0 ) = 3
oceny ( 1 ) = 5
oceny ( 2 ) = 4
End Sub
End C l a s s
Sub Main ( )
Dim s As New Student ( )
s . WystawOceny ( )
Console . WriteLine ( s . S r e d n i a ( ) )
End Sub
Klasa ta jest dość ma elastyczna, przechowuje informacje na temat ocen z trzech
lo
przedmiotów. Jedyne co można zrobić to przy pomocy metodySrednia()otrzymać
wynik średniej ocen. Zauważmy, że pole klasy ocenynie jest dostepne (nie jest

możliwa jego modyfikacja). Tablicaocenyjest ukryta dla osoby korzystajacej z klasy

Student, jest to dość ważna cecha programowania obiektowego, piszac w klase
lasna

mamy pewność, że osoba korzystajaca z niej nie bedzie mia dostepu do sk
la ladowych

pól klasy.
54
4.1. Klasy
Konstruktory
Powyższy przyk nie zawiera jeszcze informacji na temat imienia oraz nazwiska
lad
studenta. Zmodyfikujemy go dodajac brakujace pola oraz dodajac konstruktory.

Konstruktor jest z punktu widzenia programisty procedura. Procedura ta ma nazwe

New.
C l a s s Student
Dim oceny ( 2 ) As I n t e g e r
Dim nazwisko As S t r i n g
P u b l i c Sub New ( )
WystawOceny ( )
nazwisko =  brak 
End Sub
Function PobierzNazwisko ( ) As S t r i n g
Return nazwisko
End Function
Function S r e d n i a ( ) As Double
Dim suma As I n t e g e r = 0
Dim i As I n t e g e r
For Each i In oceny
suma = suma + i
Next
Return suma / oceny . Length ( )
End Function
Sub WystawOceny ( )
oceny ( 0 ) = 3
oceny ( 1 ) = 5
oceny ( 2 ) = 4
End Sub
End C l a s s
Sub Main ( )
Dim s As New Student ( )
Console . WriteLine (  {0} : ś r e d n i a ocen {1}  ,
s . PobierzNazwisko ( ) , s . S r e d n i a ( ) )
End Sub
Konstruktory
Konstruktor jest wo w momencie tworzenia obiektu przy pomocy operatora
lany
New. Konstruktor w jezykuVB.NETnosi nazweNew, możemy zdefiniować dowolnie

wiele różnych konstruktorów różniacych sie lista argumentów, jeżeli klasa nie zawiera

konstruktora, tworzony jest dla niej konstruktor domyślny.
55
4.1. Klasy
C l a s s Student
Dim oceny ( 3 ) As I n t e g e r
Dim nazwisko As S t r i n g
P u b l i c Sub New ( )
nazwisko =  brak 
WystawOceny ( )
End Sub
P u b l i c Sub New( ByVal nazwisko As S t r i n g )
Me. nazwisko = nazwisko
WystawOceny ( )
End Sub
P u b l i c Function S r e d n i a ( ) As Double
Dim suma As I n t e g e r = 0
For Each i As I n t e g e r In oceny
suma += i
Next
Return suma / oceny . Length ( )
End Function
Sub WystawOceny ( )
oceny ( 0 ) = 3
oceny ( 1 ) = 5
oceny ( 2 ) = 4
End Sub
P u b l i c Function PobierzNazwisko ( ) As S t r i n g
Return Me. nazwisko
End Function
End C l a s s
Sub Main ( )
Dim s As New Student ( )
Console . WriteLine (  {0} : {1}  ,
s . PobierzNazwisko ( ) , s . S r e d n i a ( ) )
s = New Student (  I k s i ń s k i  )
Console . WriteLine (  {0} : {1}  ,
s . PobierzNazwisko ( ) , s . S r e d n i a ( ) )
End Sub
KlasaStudentposiada dwa konstruktory o nazwieNew, różniace sie lista parame-

trów. Konstruktor pobierajacy parametr o nazwie nazwisko, odwo sie do sk
luje lado-

wej klasy o nazwienazwiskokorzystajac z operatoraMe, aby wskazać, że chodzi w

tym miejscu o sk klasy nazwisko, a nie parametr nazwisko.
ladowa
4.1.2. Klasy wC#
Klase e jezykuC#deklarujemy przy pomocy s kluczowegoclass, a cia klasy
lowa lo

zawieramy w nawiasach klamrowych:
c l a s s KlasaTestowa
{
}
Metody
Podobnie jak w jezykuVB.NETw jezykuC#mamy dwa typy metod: procedury, oraz

funkcje. Różnica polega w sposobie deklaracji. Procedura jezykaC#może zostać

potraktowana jako specjalna funkcja, która nie zwraca żadnej wartości, w kodzie
zaznaczamy to deklarujac ja jako zwracajaca typvoid.

56
4.1. Klasy
s t a t i c voi d ProceduraTestowa ( )
{
Console . WriteLine (  proced ura  ) ;
}
Powyższa procedura nie pobiera parametrów, a w wynikiem jej dzia jest wypi-
lania
sanie w oknie konsoli komunikatu procedura .

Możliwe jest deklarowanie procedur zawierajacych parametry:

s t a t i c voi d ProceduraTestowa ( s t r i n g t e k s t )
{
Console . WriteLine (  proced ura : {0}  , t e k s t ) ;
}
Komentarza wymaga użycie s kluczowegostatic, oznacza ono zadeklarowanie
lowa
statycznej metody, w skrócie można napisać, że do statycznych sk
ladowych klasy
można odwo sie bez tworzenia obiektu. MetodaProceduraTestowazosta za-
lywać la

deklarowana wewnatrz klasyProgram, klasa ta reprezentuje nasza aplikacje, i istnieje

dok jedna instancja naszego programu. Nie jest tworzony obiekt na podstawie
ladnie
klasyProgram, wszystkie metody musza być wiec zadeklarowane w tej klasie jako

statyczne.
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
ProceduraTestowa (  Test  ) ;
}
s t a t i c void ProceduraTestowa ( s t r i n g t e k s t )
{
Console . WriteLine (  pr ocedura : {0}  , t e k s t ) ;
}
} // c l a s s
Domyślnie parametry przekazywane sa przez wartość (tworzona jest kopia parametru
przekazywanego do procedury lub funkcji), istnieje również możliwość tak jak w je-

zykuVB.NETprzekazania parametru przez referencje, musimy w tym celu skorzystać
ze s kluczowegoref. JezykC#jest troche bardziej wymagajacy w stosunku do
lowa

jezykaVB.NET, nie wystarczy tylko zadeklarować procedure podajac w jej deklaracji,

że parametr ma być przekazywany jako referencja, musimy również przy wywo
laniu
procedury jawnie napisać, że chodzi nam o przekazanie parametru przez referencje:
57
4.1. Klasy
s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
i n t i = 2 ;
ProceduraTestowa ( r e f i ) ;
Console . WriteLine ( i ) ;
}
s t a t i c voi d ProceduraTestowa ( r e f i n t parametr )
{
parametr = parametr + 1 ;
}
Dodatkowo możemy zadeklarować w metodzie przekazanie parametru przez referen-
cje używajac s kluczowegoout:
lowa

s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
i n t i =2;
b o o l b ;
ProceduraTestowa ( r e f i , out b ) ;
Console . WriteLine ( i ) ;
}
s t a t i c voi d ProceduraTestowa ( r e f i n t parametr , out b o o l b )
{
parametr = parametr + 1 ;
b = t r u e ;
}
Różnica pomiedzy przekazaniem parametru z wykorzystaniem s kluczowegoref
lowa

aoutjest taka, że w przypadku przekazywania jakorefzmiennej musi zostać nada-
na wartość przed przekazaniem jej jako parametr (w kodzie powyżejint i = 2,
natomiast przekazujac parametr jakooutnie musimy nadawać mu wartości przed

przekazaniem do procedury lub funkcji, natomiast procedura lub funkcja musi przy-
pisać temu parametrowi wartość.
Jeżeli mamy przekazać do procedury lub funkcji kilka parametrów tego samego ty-
pu, możemy to zrobić przy pomocy tablicy parametrów z wykorzystaniem s
lowa
kluczowegoparams:
s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
Console . WriteLine (Suma ( 1 , 2 ) ) ;
Console . WriteLine (Suma ( 1 , 2 , 3 ) ) ;
}
s t a t i c i n t Suma( params double [ ] tab )
{
i n t suma = 0 ;
f o r e a c h ( i n t i i n tab )
{
suma += i ;
}
r e t u r n suma ;
}
58
4.1. Klasy
Funkcje
Funkcje w jezykuC#podlegaja tym samym zasadom co proceduy z ta różnica, że

zwracaja wartość przy pomocy s kluczowegoreturn:
lowa
s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
i n t i =2, j =3;
Console . WriteLine (Suma( i , j ) ) ;
}
s t a t i c i n t Suma( i n t a , i n t b )
{
r e t u r n a + b ;
}
Klasa Student
Tak jak w przypadkuVB.NETzadeklarujmy podobna klase o nazwieStudent:

c l a s s Student
{
i n t [ ] oceny = new i n t [ 3 ] ;
p u b l i c double S r e d n i a ( )
{
i n t suma = 0 ;
f o r e a c h ( i n t i i n oceny )
{
suma += i ;
}
r e t u r n suma / oceny . Length ;
}
p u b l i c void WystawOceny ( )
{
oceny [ 0 ] = 3 ;
oceny [ 1 ] = 5 ;
oceny [ 2 ] = 4 ;
}
}
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
Student s = new Student ( ) ;
s . WystawOceny ( ) ;
Console . WriteLine ( s . S r e d n i a ( ) ) ;
}
}
Zwróćmy uwage na pojawienie sie s kluczowegopublicw deklaracji metod
lowa

Srednia, orazWystawOceny, sa to tak zwane modyfikatory klasy. Zasadniczo w je-

zykuC#dostepne jest siedem modyfikatorów, w tym momencie omówimy jedynie

cztery podstawowe kontrolujace poziom dostepu:

59
4.1. Klasy
Tabela 4.1.1. Modyfikatory klasowe
modyfikator znaczenie
public metoda lub sk klasy jest w
ladowa
pe dostepna z poziomu innych typów
lni

internal
private ,metoda lub sk klasy jest
ladowa
dostepne tylko wewnatrz klasy

protected metoda lub sk jest dostepna
ladowa

w klasie oraz klasach pochodnych
Konstruktory
Klasy jezykaC#zawieraja konstruktory, które sa wywo w momencie tworzenia
lywane

obiektu, w odróżnieniu od jezykaVB.NETkonstruktor w jezykuC#posiada taka sama

nazwe jak klasa. Przyjrzyjmy sie nastepujacemu programowi:

c l a s s Student
{
i n t [ ] oceny = new i n t [ 3 ] ;
s t r i n g nazwisko ;
p u b l i c Student ( )
{
nazwisko =  brak  ;
WystawOceny ( ) ;
}
p u b l i c Student ( s t r i n g nazwisko )
{
t h i s . nazwisko = nazwisko ;
WystawOceny ( ) ;
}
p u b l i c double S r e d n i a ( )
{
i n t suma = 0 ;
f o r e a c h ( i n t i i n oceny )
{
suma += i ;
}
r e t u r n suma / oceny . Length ;
}
p u b l i c s t r i n g PobierzNazwisko ( )
{
r e t u r n nazwisko ;
}
void WystawOceny ( )
{
oceny [ 0 ] = 3 ;
oceny [ 1 ] = 5 ;
oceny [ 2 ] = 4 ;
}
}
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
Student s = new Student (  I k s i ń s k i  ) ;
Console . WriteLine (  {0} : {1}  , s . PobierzNazwisko ( ) ,
s . S r e d n i a ( ) ) ;
}
}
60
4.1. Klasy
KlasaStudentposiada dwa konstruktory o nazwieStudent, różniace sie lista pa-

rametrów (zostanie to opisane dok w dalszej cześci). Pierwsza wersja kon-
ladnie

struktora bez parametrów, nadaje sk
ladowejnazwiskowartość brak , a nastepnie


wywo metodeWystawOceny, która tym razem nie jest zadeklarowana jako pu-
luje

bliczna i nie jest dostepna z poziomu funkcjiMainklasyProgram, gdzie tworzymy

obiekt klasyStudent. Druga wersja kontruktora, zawiera jeden parametr o nazwie
nazwisko. Zwróćmy uwage, że sk klasy posiada taka sama nazwe jak nazwa
ladowa

parametru konstruktora, aby pokazać, że po lewej stronie operacji przypisania ma
znalezć sienazwiskozadeklarowane jako sk klasy, używamy s kluczowego
ladowa lowa

this, które oznacza instancje tego obiektu. Napisthis.nazwiskooznacza, że chodzi

nam o sk o nazwienazwiskoz bieżacej klasy.
ladowa

4.1.3. Przecia żanie metod
Jezyki obiektowe dostarczaja mechanizmy umożliwiajace przecia żanie metod, ogól-

nie idea przecia żania polega na możliwości napisania kilku wersji tej samej metody
(o takiej samej nazwie), różniacej sie typem parametrów, ale zwracany typ musi być

taki sam dla wszystkich wersji. Dobrym przyk jest metodaWriteLineklasy
ladem
Console, która posiada 19 różnych wariantów.
Przyk
ladVB.NET
Sub Main ( )
Console . WriteLine ( IleZnakow (  abc  ) )
Console . WriteLine ( IleZnakow ( 1 2 3 4 ) )
End Sub
Function IleZnakow ( ByVal s As S t r i n g ) As I n t e g e r
Return s . Length ( )
End Function
Function IleZnakow ( ByVal i As I n t e g e r ) As I n t e g e r
Dim s As S t r i n g
s = S t r i n g . Format (  {0}  , i )
Return IleZnakow ( s )
End Function
Przyk
ladC#
s t a t i c voi d Main ( s t r i n g [ ] a r g s )
{
Console . WriteLine ( IleZnakow (  abc  ) ) ;
Console . WriteLine ( IleZnakow ( 1 2 3 4 ) ) ;
}
s t a t i c i n t IleZnakow ( s t r i n g s )
{
r e t u r n s . Length ;
}
s t a t i c i n t IleZnakow ( i n t l )
{
s t r i n g s = s t r i n g . Format (  {0}  , l ) ;
r e t u r n IleZnakow ( s ) ;
}
61
4.1. Klasy
Zdefiniowaliśmy dwie metody o nazwieIleZnakow, różniace sie typem pobieranego

parametru, pierwsza z nich pobiera wartość typustring, druga typuint. Obie
metody zwracaja ilość znaków, pierwsza w napisie, druga ilość cyfr w liczbie. Za-
uważmy, że druga wersja metodyIleZnakowkorzysta z wersji metody, która jako
parametr pobiera napis.
4.1.4. W
laściwości (properties)
W ladowe
laściwości moga być traktowane jak wirtualne sk klasy. Dla użytkownika

klasy w le ladowe
laściwości wygladaja jak zwyk sk klasy, ale wewnatrz klasy możemy

na nie spojrzeć jak na specyficzne metody.
W
laściwości wVB.NET
Deklarujac w lowa
laściwość w jezykuVB.NETkorzystamy ze s kluczowegoProperty

po którym wystepuje nazwa w
laściwości oraz jej typ, kolejne da blokiGetorazSet

sa wykorzystywane odpowiednio jako metody do pobrania wartości oraz ustawienia
wartości.
C l a s s Osoba
Dim w ie k As I n t e g e r
P u b l i c Property Wiek ( ) As I n t e g e r
Get
Return Me. wi ek
End Get
Set ( ByVal v a l u e As I n t e g e r )
I f v a l u e < 0 Then
wiek = 0
E l s e I f v a l u e > 100 Then
wiek = 100
E l s e
wiek = v a l u e
End I f
End Set
End Property
End C l a s s
Sub Main ( )
Dim o As New Osoba ( )
o . Wiek = 24
Console . WriteLine ( o . Wiek )
End Sub
Dodatkowo możemy zadeklarować w
laściwość tylko do odczytu lub taka której może-
my tylko przypisać wartość natomiast nie możemy jej odczytać, różnica w deklaracji
polega na tym ,że jeśli chcemy zadeklarować w
laściwość tylko do odczytu potrze-
bujemy wy acznie blokuGetoraz przy definicji w lowo
l laściwości musi pojawić sie s

kluczoweReadOnly.
62
4.1. Klasy
C l a s s Osoba
Dim w ie k As I n t e g e r
P u b l i c ReadOnly Property Wiek ( ) As I n t e g e r
Get
Return Me. wi ek
End Get
End Property
End C l a s s
Kiedy chcemy zadeklarować w
laściwość, z możliwościa ustawienia jej wartości, ale
bez możliwości odczytania jej, postepujemy podobnie tym razem jednak użyjemy

s kluczowegoWriteOnlyoraz zadeklarujemy wy acznie blokSet
lowa l

P u b l i c WriteOnly Property Wiek ( ) As I n t e g e r
Set ( ByVal v a l u e As I n t e g e r )
End Set
End Property
W
laściwości wC#
W lada
laściwość zdefiniowana w klasie jezykaC#sk sie z deklaracji typu oraz nazwy

(tak jak w przypadku zwyk pola klasy), różnica polega na tym, że z każda zwia-
lego

zane sa odpowiednie blokisetorazgetgdzie deklarujemy metody odpowiedzialne za
nadanie oraz pobranie wartości. Rozważmy przyk klaseOsoba, która zawiera
ladowa
zk adowa typuinto nazwiewiek. Jeżeli sk adowa ta by zadeklarowana jako pole
l l la

klasy i udostepniona publicznie, użytkownik klasy móg nadać jej dowolna wartość
lby

(zak lu
ladamy, że poprawny wiek ma być z przedzia [0, 100]. oczywiście można by
nie udostepniać publicznie sk
ladowejwieki napisać specjalna metode np o nazwie

UstawWiek, która zmienia by wartość sk
la ladowejwiekdokonujac odpowiedniego

sprawdzenia, czy wartość jaka chcemy przypisać jest z odpowiedniego zakresu. Bar-
dziej elegancka jednak forma jest jednak ta oferowana przez mechanizm w
laściwości.
63
4.1. Klasy
c l a s s Osoba
{
i n t wiek ;
p u b l i c i n t Wiek
{
g e t
{
r e t u r n t h i s . wiek ;
}
s e t
{
i f ( v a l u e < 0)
t h i s . wiek = 0 ;
e l s e i f ( v a l u e > 100)
t h i s . wiek = 1 0 0 ;
e l s e
t h i s . wiek = v a l u e ;
}
}
} // c l a s s Osoba
c l a s s Program
{
s t a t i c void Main ( s t r i n g [ ] a r g s )
{
Osoba o = new Osoba ( ) ;
o . Wiek = 2 5 ;
Console . WriteLine ( o . Wiek ) ;
}
}
Zauważmy, że w kodzie programu, tworzac obiekt typuOsoba, do w
laściwościWiek

odwo sie tak jakby by to sk
lujemy la ladowa klasy, może ona wystapić zarówno po

lewej stronie operacji przypisania, wykonywana jest wtedy cześć kodu z blokuset,

lub po prawej stronie gdzie zwracana jest wartość (wykonywany jest blokget).
64
Rozdzia 5
l
Laboratorium 5
5.1. Aplikacje Okienkowe
Interfejs Windows Forms (nazywany także WinForms) znajduje sie w przestrze-

ni nazwSystem.Windows.Forms. Zawiera klasy przydatne przy tworzeniu aplikacji
dzia lni
lajacych w systemie Windows, w pe wykorzystujacych bogate funkcje interfej-

su użytkownika. Interfejs ten powsta na podstawie biblioteki Windows Foundation
l
Classes, przygotowanej poczatkowo dla jezykaJ++. Wszystkie jezyki programowa-

nia platformy .NET Framework  niezależnie od tego, z jakiej biblioteki korzysta
ly
dotychczas (MFClub wywo
laniaWin32APIw przypadkuC++alboVB Forms Engine
w przypadkuVisual Basic)  wykorzystuja ten sam sposób komunikacji z graficz-
nym interfejsem użytkownika systemu Windows. Programista nie musi już korzystać
bezpośrednio z funkcji interfejsu WindowsAPI.
PrzestrzeńSystem.Windows.Formszawiera klasy definiujace kontrolki, klasy po-

zwalajace tworzyć kontrolki użytkownika, klasy odpowiedzialne za tworzenie okien

aplikacji i okien aplikacji wielodokumentowych (MDI), okna dialogowe i inne. Za-
pewniona jest także obs standardowych okien dialogowych (otwieranie plików,
luga
ustawienia wydruku, podglad wydruku i inne), a także tworzenie menu i etykiet

podpowiedzi (tooltip).
Aby wVisual Studioutworzyć nowy projekt aplikacji okienkowej, w menuFile
wybieramy pozycjeNew, a nastepnieProject. Wyświetlone zostanie okno dialogo-

we z szablonami projektów. W lewej cześci okna wybieramy jezyk programowania

(Visual BasiclubVisual C#), a w prawej  typ projektu, jaki chcemy utworzyć
(Windows Application). W poluNamepodajemy nazwe projektu, a w poluLoca-

tion folder, w którym projekt ma zostać zapisany.
65
5.1. Aplikacje Okienkowe
Rys. 5.1.1. Tworzenie nowego projektu dla aplikacji okienkowej
Visual Studio automatycznie utworzy i skonfiguruje projekt sk
ladajacy cie z dwóch

plików - pliku zawierajacego opis podzespo tworzonego przez wszystkie pliki apli-
lu

kacji oraz pliku zawierajacego projekt formularza aplikacji. Jeśli podczas tworzenia

projektu wybrano jezykC#, pliki te beda mia nazwy odpowiednio AssemblyInfo.cs
ly

i Form1.cs. Jeśli wybranoVB.NET- AssemblyInfo.vb i Form1.vb.
Rys. 5.1.2. Utworzona aplikacjaVB.NET
66
5.2. Prosty kalkulator
5.2. Prosty kalkulator
Jako pierwsza aplikacje windowsowa napiszemy program, pobierajacy od użytkowni-

ka dwie liczby ca oraz umożliwiajacy wybranie mu operacji jaka chce wykonać
lkowite

na tych liczbach. Na razie za
lożymy, że wprowadzane przez użytkownika dane beda

poprawnymi liczbami i nie bedziemy zajmowali sie obs wyjatków.
luga

Do wprowadzenia danych pos
lużymy sie kontrolka o nazwieTextBox, a do wybrania

operacji guzikiem, kontrolka typuButton. Do wyświetlenia wyniku wykorzystamy
kontrolkeLabel.

Najpierw umieśćmy na formie dwie kontrolkiTextBox, wybierajac je z palety kontro-

lek (oknoToolBox). Jeżeli okno kontrolek nie jest widoczne w aczymy je wybierajac
l

z menuViewpozycjeToolbox.

nastepnie umieśćmy na formie cztery kontrolkiButton, oraz jedna Label.

Rys. 5.2.1. Wyglad okienka

Po umieszczeniu kontrolek na formie trzeba jeszcze dostosować ich wyglad tak aby

spe l nasze wymagania. Wiekszość ustawień możemy dokonać z poziomu edytora
lnia

w
laściwości (okno properties).
Dla pól edycyjnych ustawimy wyrównywanie wprowadzanego tekstu do prawej stro-
ny, aby uzyskać ten efekt zaznaczamy pierwsza kontrolke, nastepnie przechodzimy do

edytora w laściwości o nazwieTextAlign, i przestawimy
laściwości i odszukujemy w
jej wartość naRight, możemy też zmodyfikować w
laściwośćText, która zawiera tekst
wyświetlany przez kontrolke wpisujac w pole wartości 0. Analogicznie postepujemy

z druga kontrolka TextBox.
Nastepnie zajmiemy sie kontrolkamiButton, zaznaczmy pierwsza z nich a nastep-

nie w edytorze w laściwośćTextustawiajac ja na +, zmieńmy
laściwości zmieńmy w

rozmiar kontrolki, albo przy pomocy myszy albo w edytorze w
laściwości ustawiajac

w
laściwośćSizena 26,26. Analogicznie postepujemy z kolejnymi guzikami zmienia-

jac ich w
laściwościTextodpowiednio na -,*,/.

Na zakończenie zmodyfikujemy kontrolkeLabel, odszukujemy w
laściwośćAutosize

i zmieniamy ja na false (pozwoli to na dowolna zmiane rozmiaru kontrolki). Kolor

t zmienimy modyfikujac w
la laściwośćBackColor, natomiast rozmiar czcionki mo-

67
5.2. Prosty kalkulator
dyfikujac w laściwość
laściwośćFont. Kolor czcionki możemy zmienić modyfikujac w

ForeColor.
Możemy uruchomić nasza aplikacje i zobaczyć jak wyglada wizualnie podczas pra-

cy, niestety poza możliwościa wprowadzenia w polach edycyjnych wartości program
nie bedzie nic robi oczywiście musimy dopisać brakujacy kod odpowiedzialny za
l,

wykonywanie operacji.
Piszac programy w środowisku.NETkorzystamy z tak zwanego programowania ste-

rowanego zdarzeniami. Nasz program sk sie z procedur, które uruchamiane sa w
lada

momencie zajścia jakiegoś zdarzenia, np użytkownik wcisna jakiś klawisz, nacisna
l

guzik myszki, wcisna guzik znajdujacy sie na formie itd. Oczywiście zdarzenia nie
l

musza pochodzić wy acznie od użytkownika, moga być również generowane przez
l

system operacyjny.
5.2.1. KodVB.NET
Kliknijmy dwu krotnie na guziku, któy bedzie odpowiedzialny za wykonanie operacji

dodawania, do kodu zostanie dodana metoda:
P r i v a t e Sub b u t t o n 1 C l i c k ( ByVal s e n d e r As System . Object ,
ByVal e As System . EventArgs ) Handles button1 . C l i c k
End Sub
Wszystko co musimy zrobić to wpisać kod, który zostanie wykonany po naciśnieciu

guzika +. Wykonana ma zostać operacja dodania dwóch liczb wpisanych w polach
edycyjnych, oraz wynik dodawania ma zostać wyświetlony w kontrolceLabel.
Zwróćmy uwage, że po umieszczeniu kolejnych kontrolek ich nazwa sk sie z
lada

nazwy klasy na podstawie której sa tworzone oraz kolejnego numeru. Pierwsze pole
edycyjne nosi nazwetextBox1drugietextBox2, guziki odpowiedniobutton1(+),

button2(-),button3(*),button4(/), oraz etykietalabel1, nazwy te sa referencja-
mi obiektów, w kodzie programu możemy sie odwo do konkretnych kontrolek
lywać

poprzez te nazwy. Oczywiście dobrym pomys jest zmiana domyślnych nazw na
lem
takie które beda w stanie nam coś powiedzieć tutaj jednak bedziemy trzymali sie


narazie domyślnych nazw.
Wróćmy jednak do procedury obs zdarzenia, jej domyślna nazwa sk sie z
lugi lada

nazwy obiektubutton1oraz zdarzenia, które obs
lugujeclick.
Metoda ta powinna pobrać wartości wprowadzone przez użytkownika, dokonać ich
sumowania, a wynik wyświetlić w kontrolcelabel1.
68
5.2. Prosty kalkulator
P r i v a t e Sub b u t t o n 1 C l i c k ( ByVal s e n d e r As System . Object ,
ByVal e As System . EventArgs ) Handles button1 . C l i c k
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim s As S t r i n g
l i c z b a 1 = textBox1 . Text
l i c z b a 2 = textBox2 . Text
s = S t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 )
l a b e l 1 . Text = s
End Sub
Analogicznie postepujemy w przypadku pozosta guzików, dodajemy metody ob-
lych

s
lugujace zdarzenieclickzmieniajac oczywiście operacje, która ma zostać wykona-

na.
Możemy zauważyć, że spory fragment kodu jest wspólny dla wszystkich guzików,
każdy pobiera w ten sam sposób wartości z pól edycyjnych, i tak samo wyświetla
wynik, jedyna różnica polega na budowaniu zawartości zmiennejs.
Zwróćmy uwage na parametry metod obs zdarzeń, wszystkie one posiadaja pa-
lugi

rametr o nazwiesendertypuobject, zawiera on referencje do obiektu, który wyge-

nerowa zdarzenie. Klasaobjectjest bazowa klasa, z której wywodza sie wszystkie
l

kontrolki bibliotekiForms. Możemy skorzystać z tego parametru, wykorzystamy ta
metode do obs zdarzeniaclickwszystkich guzików kalkulatora.
lugi

P r i v a t e Sub b u t t o n 1 C l i c k ( ByVal s e n d e r As System . Object ,
ByVal e As System . EventArgs ) Handles button1 . C l i c k
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim s As S t r i n g =  
Dim b As Button = D i r e c t C a s t ( sender , Button )
l i c z b a 1 = textBox1 . Text
l i c z b a 2 = textBox2 . Text
I f b . Equals ( button1 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 )
End I f
I f b . Equals ( button2 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 - l i c z b a 2 )
End I f
I f b . Equals ( button3 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 " l i c z b a 2 )
End I f
I f b . Equals ( button4 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 / l i c z b a 2 )
End I f
l a b e l 1 . Text = s
End Sub
Po zmianie kodu metodybutton1_clickmusimy w edytorze w
laściwości przypisać
ta metode dla pozosta guzików do obs zdarzeniaclick. Po wybraniu guzika
lych lugi

w edytorze w lta lyskawica), odszukujemy
laściwości klikamy na ikonkeEvents(żó b

zdarzenieclicki ustawiamy procedure obs wybierajac z listybutton1_click.
lugi

Powyższy kod jest niestety podatny na b ednie wprowadzone dane, jeżeli pola edy-
l
cyjne nie zawieraja poprawnej liczby, konwersja napisu na liczbe spowoduje powsta-

69
5.2. Prosty kalkulator
nie wyjatku i nasz program zostanie przerwany. Dodajmy do naszego kodu obs
luge

wyjatku.

P r i v a t e Sub b u t t o n 1 C l i c k ( ByVal s e n d e r As System . Object ,
ByVal e As System . EventArgs ) Handles button1 . C l i c k
Dim l i c z b a 1 As I n t e g e r
Dim l i c z b a 2 As I n t e g e r
Dim s As S t r i n g =  
Dim b As Button D i r e c t C a s t ( sender , Button )
Dim ok As Boolean = True
Try
l i c z b a 1 = textBox1 . Text
l i c z b a 2 = textBox2 . Text
Catch
ok = F a l s e
End Try
I f ok Then
I f b . Equals ( button1 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 )
End I f
I f b . Equals ( button2 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 - l i c z b a 2 )
End I f
I f b . Equals ( button3 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 " l i c z b a 2 )
End I f
I f b . Equals ( button4 ) Then
s = S t r i n g . Format (  {0}  , l i c z b a 1 / l i c z b a 2 )
End I f
E l s e
s =  to n i e j e s t l i c z b a ! 
End I f
l a b e l 1 . Text = s
End Sub
Po wpisaniu niepoprawnej liczby w polu edycyjnym i wybraniu operacji, aplikacja
nie zostanie przerwana, a wyświetli komunikat o niepoprawnie wprowadzonej liczbie.
Rys. 5.2.2. Komunikat o b edzie
l

Nowa zmienna o nazwie ok przyjmuje wartośćTruew momencie kiedy wystapi

wyjatek (blok Try) sterowanie przekazywane jest do blokuCatchgdzie zmienna ok

jest modyfikowana i przypisana jest jej wartośćFalse. Operacje wykonywane sa
tylko kiedy ok ma wartośćTrue, nastepnie zmiennejsprzypisywany jest lańcuch


znaków reprezentujacy wynik. Kiedy zmiennaokma wartośćFalsena zmienna s

przypisywany jest tekst informujacy o nie poprawnej liczbie.

70
5.2. Prosty kalkulator
5.2.2. KodC#
Po dwukrotnym kliknieciu na guziku (+) do kodu zostanie dodana procedura obs
lugi

zdarzeniaclickdla guzika (button1)
p r i v a t e void b u t t o n 1 C l i c k ( o b j e c t sender , EventArgs e )
{
}
Dopiszemy kod pobierajacy wartości liczbowe z pól edycyjnych, nastepie dokonujacy

sumowania tych liczb i wyświetlajacy wynik w kontrolcelabel1.

p r i v a t e void b u t t o n 1 C l i c k ( o b j e c t sender , EventArgs e )
{
i n t l i c z b a 1 = 0 , l i c z b a 2 = 0 ;
s t r i n g s =   ;
l i c z b a 1 = i n t . Parse ( textBox1 . Text ) ;
l i c z b a 2 = i n t . Parse ( textBox2 . Text ) ;
s = s t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 ) ;
l a b e l 1 . Text = s ;
}
Możemy postapić analogicznie w przypadku pozosta guzików i dopisać odpo-
lych

wiednie metody obs zdarzeniaclick, jednak zauważmy, że kod który bedziemy
lugi

dopisywali bedzie zawiera wiele powtarzajacych sie fragmentów.
l

Możemy napisać ogólna metode obs zdarzeniaclickdla wszystkich guzików
lugi

kalkulatora korzystajac z parametrusender.

p r i v a t e void b u t t o n 1 C l i c k ( o b j e c t sender , EventArgs e )
{
i n t l i c z b a 1 = 0 , l i c z b a 2 = 0 ;
s t r i n g s =   ;
Button b = ( Button ) s e n d e r ;
l i c z b a 1 = i n t . Parse ( textBox1 . Text ) ;
l i c z b a 2 = i n t . Parse ( textBox2 . Text ) ;
i f ( b . Equals ( button1 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 ) ;
i f ( b . Equals ( button2 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 - l i c z b a 2 ) ;
i f ( b . Equals ( button3 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 " l i c z b a 2 ) ;
i f ( b . Equals ( button4 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 / l i c z b a 2 ) ;
l a b e l 1 . Text = s ;
}
Na uwage zas fragment koduButton b = (Button)sender, ponieważ para-
luguje

metrsenderjest typuobjectmusimy dokonać rzutowania typuobjectna typ
Button, w jezykuC#rzutowanie typu wykonujemy piszac w nawiasach okrag
lych

nazwe typu na który chcemy dokonać rzutowania, a dalej nazwe zmiennej.

71
5.2. Prosty kalkulator
Jedyne co zosta to przypisanie metodybutton1_clickjako reakcje na zdarzenie
lo

clickdla pozosta guzików.
lych
Tak jak w przypadku koduVB.NETmożemy uzupe kod o obs wyjatku jaki
lnić luge

może sie pojawić przy konwersji napisów z pól edycyjnych na liczby.

p r i v a t e void b u t t o n 1 C l i c k ( o b j e c t sender , EventArgs e )
{
i n t l i c z b a 1 = 0 , l i c z b a 2 = 0 ;
s t r i n g s =   ;
Button b = ( Button ) s e n d e r ;
b o o l ok = t r u e ;
t r y
{
l i c z b a 1 = i n t . Parse ( textBox1 . Text ) ;
l i c z b a 2 = i n t . Parse ( textBox2 . Text ) ;
}
c a t c h
{
ok = f a l s e ;
}
i f ( ok )
{
i f ( b . Equals ( button1 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 + l i c z b a 2 ) ;
i f ( b . Equals ( button2 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 - l i c z b a 2 ) ;
i f ( b . Equals ( button3 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 " l i c z b a 2 ) ;
i f ( b . Equals ( button4 ) )
s = s t r i n g . Format (  {0}  , l i c z b a 1 / l i c z b a 2 ) ;
}
e l s e
s =  to n i e j e s t l i c z b a !  ;
l a b e l 1 . Text = s ;
}
Zauważmy, że powyższy kod nie obs jeszcze jednej sytuacji w której może
luguje
wystapić wyjatek, mianowicie dzielenia przez zero. Możemy zmodyfikować powyższy

kod obudowujac operacje dzielenia kolejnym blokiemtry

i f ( b . Equals ( button4 ) )
{
t r y
{
s = s t r i n g . Format (  {0}  , l i c z b a 1 / l i c z b a 2 ) ;
}
c a t c h
{
s =  d z i e l e n i e p r z e z z e r o !  ;
}
}
Kiedy któreś z pól edycyjnych bedzie zawiera napis, który nie da sie przekonwer-
lo

tować na liczbe wyświetlony zostanie komunikat o niepoprawnej liczbie, natomiast

kiedy oba napisy beda poprawnymi liczbami, a drugi bedzie zerem, podczas próby

wykonania operacji dzielenia zostanie wyświetlony napis dzielenie przez zero! .

72
5.3. Zegarek elektroniczny
5.3. Zegarek elektroniczny
Kolejny program bedzie wyświetla bieżaca date i godzine lub tylko godzine. Ja-
l

ko kontrolke do wyświetlenia godziny użyjemy kontrolkiLabel, dodatkowo jako

prze acznik do wyboru trybu pracy zegarka (data i godzina lub godzina) kontrolki
l

CheckBox.
Problemem jest tylko to gdzie mamy umieścić procedure wyświetlajaca godzine. Jak

wspomnieliśmy wcześniej nasze aplikacje sa sterowane zdarzeniami, możemy wiec

skorzystać z kontrolkiTimer, która reprezentuje zegar, możemy ustawić czestotliwość

tykania tego zegara w efekcie końcowym nasza aplikacja co określony okres czasu

bedzie otrzymywa komunikat o tyknieciu zegara.
la


Umieśćmy na formie kontrolkeLabel,CheckBoxorazTimer.

Rys. 5.3.1. Wyglad okienka programu zegarek

Po umieszczeniu kontrolek na formie przestawmy odpowiednie w
laściwości korzysta-
jac z edytora w lnia
laściwości, tak aby spe ly nasze wymagania co do wygladu.

Kolejnym krokiem jest ustawienie odpowiednich w
laściwości kontrolkiTimer, po
pierwsze musimy w aczyć generowanie zdarzeń dla kontrolki ustawiajac jej w
l laści-

wośćEnablednatrue, oraz ustawić w
laściwośćIntervalokreślajaca jak czesto ma

być generowany komunikat tykniecie zegara (Tick), wartość ta podawana jest w


milisekundach, ponieważ nasz zegar bedzie wyświetla godziny, minuty oraz sekun-
l

dy, możemy w
laściwośćIntervalustawić na 1000 co oznacza, że komunikat bedzie

generowany raz na sekunde.

Jeżeli chcemy aby użytkownik nie móg zmienić rozmiarów okna podczas pracy pro-
l
gramu możemy zmodyfikować w
laściwość formyFormBorderStyleprzypisujac jej

wartośćFixedDialog, oraz zmodyfikować w
laściwośćMaximizeBoxprzestawiajac jej

wartość nafalseaby uczynić guzik s do maksymalizacji okna nieaktywnym.
lużacy

Okno programu bedzie można tylko zminimalizować (zwina ć na belke) oraz przy-

wrócić do pierwotnego rozmiaru.
73
5.3. Zegarek elektroniczny
5.3.1. KodC#
Klikaamy dwukrotnie na kontrolceTimer, zostanie dodana metoda obs zdarzenia
lugi
Tick. Dopisujemy kod odpowiedzialny za wyświetlenie daty i godziny. Bieżaca date

i godzine pobierzemy korzystajac z w
laściwościNowklasyDateTime

p r i v a t e void t i m e r 1 T i c k ( o b j e c t sender , EventArgs e )
{
s t r i n g s ;
s = DateTime . Now . ToString ( ) ;
l a b e l 1 . Text = s ;
}
Zauważmy, że po uruchomieniu programu wystepuje opóznienie zanim napis wy-

świetlany w etykiecielabel1zmieni sie na aktualna date i godzine, spowodowane

jest to tym, że pierwsze zdarzenieTickwystapi dopiero po up sekundy. Kod
lywie

pobierajacy aktualna date i godzine znajduje sie w metodzie obs tego zdarzenia.
lugi

Dobrym pomys by zmodyfikowanie programu tak aby zaraz po uruchomie-
lem loby
niu wyświetlone zosta poprawne informacje. Pytaniem jest tylko gdzie umieścić
ly
odpowiedni kod.
Przypomnijmy sobie pojecie konstruktora. Konstruktor wywo jest w momen-
lywany

cie tworzenia obiektu, ponieważ nasze okno (forma) jest tak naprawde obiektem

klasyForm1możemy odszukać w kodzie programu konstruktor tej klasy, który zo-
sta wygenerowany przez kreatora aplikacji okienkowej i wyglada w nastepujaco:
l

DateTime
p u b l i c Form1 ( )
{
I n i t i a l i z e C o m p o n e n t ( ) ;
}
Możemy dopisać nasz kod po instrukcjiInitializeComponent(). Oczywiście mo-
żemy przepisać kod znajdujacy sie w metodzie obs
lugujacej zdarzenieTicknaszego

zegara, ale nie jest to zbyt dobry styl programowania, bedziemy mieli powtórzony

ten sam fragment kodu dwa razy w naszym programie. Bardziej elegancka metoda
bedzie skorzystanie z faktu, że metoda obs zdarzeniaTickjest tak naprawde
lugi

metoda zadeklarowana w klasieForm1i możemy ja wywo tak jak każda inna
lać
metode. jedyny problem polega na tym, że metodatimer1_Tickpobiera dwa ar-

gumenty, jeden typuobjectdrugi typuEventArgs, możemy sobie z tym poradzić
przekazujac w miejsce tych parametrów wartośćnull.

p u b l i c Form1 ( )
{
I n i t i a l i z e C o m p o n e n t ( ) ;
t i m e r 1 T i c k ( n u l l , n u l l ) ;
}
74
5.3. Zegarek elektroniczny
Teraz po uruchomieniu programu powinniśmy na starcie zobaczyć bieżaca date oraz

godzine.

Brakuje nam jeszcze obs zdarzenia, które generowane jest w momencie naciska-
lugi
nia kontrolkiCheckBox. Zastanówmy sie jednak jak ma dzia nasz program, po
lać

zaznaczeniu polaData i godzinachcemy aby zegar wyświetla date oraz godzine,
l

natomiast w momencie, kiedy pole to jest odznaczone chcemy aby wyświetlana by
la
tylko godzina. KontrolkaCheckBoxposiada w
laściwość o nazwieChecked, która in-
formuje nas o tym jaki jest jej stan. Jest to w
laściwość typu logicznego przyjmujaca

dwie wartościtrue(zaznaczona) lubfalse(odznaczona). Możemy skorzystać z tego
faktu w metodzie obs
lugujacej zdarzenieTickkontrolkiTimerbudujac wyświetlany


lańcuch znaków w zależności od stanu kontrolkiCheckBox.
p r i v a t e void t i m e r 1 T i c k ( o b j e c t sender , EventArgs e )
{
s t r i n g s ;
DateTime d = DateTime . Now ;
i f ( checkBox1 . Checked )
s = d . ToString ( ) ;
e l s e
s = s t r i n g . Format (  { 0 :T}  , d ) ;
l a b e l 1 . Text = s ;
}
Pojawia sie podobny problem jak poprzednio po uruchomieniu aplikacji, kiedy kli-

kamy kontrolkecheckBox1aktualizacja zawartości wyświetlanej w kontrolcela-

bel1odbywa sie z opóznieniem. Możemy sobie z tym poradzić wywo metode
lujac

timer1_Tick recznie w metodzie obs zdarzenia generowanego w momencie,
lugi


kiedy kontrolkaCheckBoxzmienia swój stan. Kliknijmy dwukrotnie na kontrolce
checkBox1do kodu dopisana zostanie metodacheckBox1_CheckedChangedw której
dopiszmy nastepujacy kod:

p r i v a t e void checkBox1 CheckedChanged (
o b j e c t sender , EventArgs e )
{
t i m e r 1 T i c k ( n u l l , n u l l ) ;
}
Kiedy uruchomimy program, wyświetlona zostanie bieżaca godzina. Wraz z up
ly-

wem czasu wyświetlana godzina bedzie aktualizowana i bedziemy mieli wrażenie

chodzacego zegara, kiedy zaznaczymy poleData i godzina, format wyświetlany


przez zegarek zmieni sie na wyświetlanie bieżacej daty oraz godziny.

75
S
lowniczek skrótów
Skrót Znaczenie
.NET .NET Framework  platforma firmy Microsoft .NET
ADO
ASP
C jezyk programowania

C++ jezyk programowania

C# jezyk programowania

CAS Code Access Security  mechanizm kontroli bezpieczeństwa
wykonywania aplikacji
CLR Common Language Runtime  wspólne środowisko uruchomieniowe
CTS Common Type System  wspólny zestaw typów danych
IL patrz MSIL
JIT just-in-time compilation  - kompilacja w sama pore,

kompilacja cześciowa, kompiluje tylko używane metody

MSIL Microsoft Intermediate Language  kod pośredni, zrozumia
ly
dla warstwy CLR
NGEN Native Image Generator  dokonuje pe kompilacji kodu
lnej
NIC Native Image Cache  pamieć podreczna obrazów kodu natywnego

RBS Role-Based Security
SDK Software Development Kit  system u
latwiajacy programowanie

VB Visual Basic  jezyk programowania

VS Visual Studio  środowisko programistyczne firmy Microsoft
76


Wyszukiwarka

Podobne podstrony:
2 Edytor tekstu Writer
Edytor tekstu Vi
Analiza Matematyczna 2 Zadania
ZARZĄDZANIE FINANSAMI cwiczenia zadania rozwiazaneE
ZADANIE (11)
zadanie domowe zestaw
Zadania 1
W 4 zadanie wartswa 2013
Sprawdzian 5 kl 2 matematyka zadania
zadania1
Zadania 2015 9
Logika W8 zadania
Logika troch teorii zadania

więcej podobnych podstron