1 Cel ¢wiczenia.
1
POLITECHNIKA LSKA
w Gliwicach
WYDZIA INYNIERII BIOMEDYCZNEJ
LABORATORIUM
JZYKÓW PROGRAMOWANIA
Pierwsze kroki w j¦zyku C#.
Opracowaª: dr in». Wojciech Wi¦cªawek
1 Cel ¢wiczenia.
Celem ¢wiczenia jest zapoznanie studentów z podstawami tworzenia aplikacji konsolowych w j¦zyku C# w ±ro-
dowisku Visual Studio 2008 rmy Microsoft, struktur¡ programu C# oraz typami zmiennych.
2 Wprowadzenie.
J¦zyk C# zostaª stworzony do celów programowania, przeªomowej pod wzgl¦dem technologicznym, platformy
.NET Framework. ¡czy on wiele najlepszych cech j¦zyków C++ oraz Microsoft Visual Basic, lecz ma bardziej
przejrzyst¡ i logiczn¡ struktur¦. J¦zyk ten jest nadal dynamicznie rozwijany, o czym ±wiadcz¡ kolejne jego
wersje, w których dokonano implementacji wielu mechanizmów znanych z sytemu Windows takich jak: ADO
(ang. ActiveX Data Objects), ASP (ang. Active Server Pages), XML (ang. Extensible Markup Language), WMI
(ang. Windows Management Instrumentation).
Platforma .NET Framework zawiera wspólny aparat wykonawczy dla ró»nych j¦zyków oraz bogat¡ bibliotek¦
klas. W ramach platformy Microsoft .NET zdeniowano swoisty j¦zyk uniwersalny, tzw. CLS (ang. Common
Language Subset - wspólna cz¦±¢ j¦zyków). Zapewnia on pªynn¡ wspóªprac¦ mi¦dzy zgodnymi ze standardem
CLS j¦zykami i bibliotekami klas. J¦zyk C# sam w sobie nie zawiera wbudowanych bibliotek klas, zamiast tego
korzysta z bibliotek BCL (ang. Base Class Libraries) dostarczanych przez platform¦ .NET Framework (s¡ one
dost¦pne dla ka»dego j¦zyka .NET) [1].
J¦zyk C# nie jest od razu kompilowany do postaci kodu maszynowego. Po kompilacji kodu ¹ródªowego
otrzymujemy IL (ang. Intermediate Language), dopiero podczas uruchamiania programu CLR (ang. Common
Language Runtime) przeksztaªca IL do postaci wykonywalnej.
Program w C# jest tworzony poprzez budowanie nowych typów (gªównie klas) oraz deklarowanie ich obiek-
tów. W skªad ka»dego typu wchodz¡ dane oraz funkcje skªadowe.
3 rodowisko Visual Studio 2008
2
Dla kompilatora C# uªo»enie oraz nazwy plików ¹ródªowych (z rozszerzeniem .cs) nie maj¡ znaczenia.
Zgodnie z konwencj¡ powinno si¦ jednak ka»d¡ klas¦ umieszcza¢ w osobnym pliku o nazwie odpowiadaj¡cej
nazwie tej klasy, natomiast ka»dy plik powinien si¦ znajdowa¢ w katalogu o nazwie odpowiadaj¡cej przestrzeni
nazw, do której nale»y ta klasa [2].
3 rodowisko Visual Studio 2008
Jak wiadomo tworzenie programu komputerowego wymaga napisania kodu ¹ródªowego, a nast¦pnie jego kom-
pilacji. Ponadto podczas pisania programu bardzo pomocne s¡ dodatkowe narz¦dzia uªatwiaj¡ce pisanie i te-
stowanie kodu. Te wszystkie funkcje oferuje zintegrowane ±rodowisko programistyczne IDE (ang. Integrated
Development Environment), którego jednym z przykªadów jest Visual Studio 2008, dost¦pne w Politechnice
l¡skiej na zasadach licencji MSDNAA (ang. Microsoft Developer Network Academic Alliance) [3].
W celu napisania programu z menu File wybieramy pozycj¦ New, a dalej Project. Posªuguj¡c si¦ drzewem
typów projektów, widocznym z lewej strony na Rys. 1, wybieramy kolejno: Other Languages Visual C#
Windows, a dalej z pola szablonów Console Application (prawa strona Rys. 1) oraz w polu Name poda-
jemy nazw¦ tworzonego przez nas projektu. W efekcie otrzymamy gotowy, pusty szablon projektu. Warto tak
Rys. 1: Okno wyboru nowego projektu.
przygotowa¢ sobie ±rodowisko by okno VS 2008 skªadaªo si¦ z trzech gªównych cz¦±ci Rys. 2:
1. Drzewa projektu (Solution Explorer),
2. Edytora kodu,
3. Okna komunikatów.
W celu takiej konguracji okien ±rodowiska pomocne mog¡ by¢ pozycje menu View takie jak: Solution
Explorer, Error List, Output oraz odpowiednie przeci¡ganie okien przy pomocy myszki.
W oknie Solution Explorer widoczne s¡ foldery i pliki tworz¡ce projekt, o podanej wcze±niej nazwie, wy-
±wietlanej na samej górze drzewa. Wskazuje on plik projektu o rozszerzeniu .csproj. Je»eli projekt utworzony
zostaª jako nowe rozwi¡zanie (ang. solution) na dysku w okre±lonej uprzednio lokalizacji powstaª plik z rozsze-
rzeniem .sln. Poni»ej w drzewie znajduje si¦ pozycja Properties okre±laj¡ca folder projektu, zawieraj¡cy pliki
z informacjami o atrybutach projektu (standardowo znajduje si¦ tam plik AsemblyInfo.cs). Dalej traamy
3 rodowisko Visual Studio 2008
3
Rys. 2: Okno nowego projektu.
na folder References zawieraj¡cy odwoªania (referencje) do przestrzeni nazw u»ywanych przez program. Jako
ostatni wyst¦puje plik zawieraj¡cy kod ¹ródªowy aplikacji (rozszerzenie .cs).
Tak utworzony projekt podczas próby opuszczenia ±rodowiska b¡d¹ po wybraniu pozycji Save All z menu
File mo»e zosta¢ zapami¦tany w oddzielnym dla niego katalogu (zaª¡czona opcja Create Directory for
Solution) w podanej przez u»ytkownika lokalizacji na dysku. Wszystko to kongurujemy w oknie widocznym
na Rys. 3.
Rys. 3: Zapami¦tanie projektu na dysku.
Kod ¹ródªowy tworzonej przez nas aplikacji konsolowej kontynuujemy w oknie edytora, w pliku o nazwie
adekwatnej do utworzonego przez nas projektu z rozszerzeniem .cs. Szkielet aplikacji wygenerowany przez
±rodowisko VS 2008 ma posta¢:
using System;
using System.Collections.Generic;
using System.Text;
namespace Instrukcja{
class Program{
static void Main(string[] args){
}
3.1 Pierwszy program
4
}
}
Aplikacja ta skªada si¦ z cz¦±ci wykorzystuj¡cej dyrektyw¦ using do wskazania u»ywanych w programie
przestrzeni nazw. Dalej nast¦puje deklaracja przestrzeni nazw Instrukcja przy pomocy sªowa kluczowego
namespace, w której znajduje si¦ tworzona aplikacja. Kolejn¡ rzecz¡ jest deklaracja klasy o nazwie Program,
która domy±lnie zawiera tworzon¡ aplikacj¦ konsolow¡. Poni»ej znajduje si¦ deklaracja metody (funkcji), której
nazwa, podobnie jak w j¦zyku C, to Main. J¦zyk C# podobnie jak C++ rozró»nia wielko±¢ liter przy wszystkich
poleceniach, metodach czy nazwach zmiennych, st¡d te» zapis main spowoduje pojawienie si¦ informacji o bª¦-
dzie, widocznej w dolnej cz¦±ci okna ±rodowiska, na zakªadce Error List. Metoda Main rozpoczyna dziaªanie
programu. Musi by¢ ona metod¡ statyczn¡ st¡d jej denicj¦ poprzedza sªowo kluczowe static. Kolejne sªowo
kluczowe void oznacza, i» metoda nie zwraca »adnej warto±ci (podobnie jak w j¦zyku C funkcja niezwracaj¡ca
warto±ci byªa wªa±nie typu void). Poniewa» metoda Main jest pusta (nie zawiera »adnej instrukcji) z punktu
widzenia u»ytkownika mo»na powiedzie¢, »e nic nie robi. St¡d próba uruchomienia programu wraz z jego kom-
pilacj¡ (menu Debug pozycja Start Debugging, klawisz skrótu F5) spowoduje wyª¡cznie chwilowe pokazanie
okna u»ytkownika. Je»eli wcze±niej przeprowadzono zako«czon¡ sukcesem kompilacj¦ kodu programu mo»na
uruchomi¢ go bez ponownej kompilacji wybieraj¡c z menu Debug pozycj¦ Start Without Debugging (skrót
klawiszowy Ctrl+F5). Sposób ten pozwoli na zaobserwowanie efektów realizacji programu w oknie konsoli wraz
z wy±wietleniem komunikatu o konieczno±ci naci±ni¦cia dowolnego klawisza.
Wygenerowany przez ±rodowisko szkielet programu jest troch¦ nadmiarowy i da si¦ upro±ci¢ do postaci:
using System;
class Program{
static void Main(){
}
}
w której nie tworzy si¦ przestrzeni nazw, metoda Main jest bezparametryczna, a przestrze« nazw ograniczona
do przestrzeni systemowej.
Istotne jest aby w ramach jednego programu »adna klasa ani struktura nie zawieraªa wi¦cej ni» jednej
metody Main, której denicja speªnia warunki nakªadane na punkt wej±cia do programu. Wprawdzie dzi¦ki
mo»liwo±ci przeci¡»ania metod dozwolone s¡ dodatkowe wersje metody Main, ale nale»y tu pami¦ta¢ o pewnych
dodatkowych warunkach. Przeci¡»anie metod b¦dzie tematem oddzielnego laboratorium.
3.1 Pierwszy program
Zazwyczaj w kursach nauki j¦zyków programowania jako pierwszy program, prezentowana jest aplikacja wy-
±wietlaj¡ca na ekranie pewien komunikat. Rozbudowa przytoczonego powy»ej szkieletu aplikacji w j¦zyku C#
realizuj¡ca takie zadanie miaªaby posta¢:
using System;
class Program{
static void Main(){
Console.WriteLine("Pierwszy program");
}
}
Wykorzystuje ona metod¦ WriteLine() obiektu Console. Zapis tego faktu polega na wskazaniu najpierw obiektu
(Console), nast¦pnie u»yciu operatora kropki (.) pozwalaj¡cego uzyska¢ dost¦p do metod zaimplementowanych
w tej klasie. W naszym przypadku do metody pozwalaj¡cej na wy±wietlenie komunikatu na ekranie u»ytkownika.
Komunikat ten podawany jest w cudzysªowie.
3.2 Kompilacja
5
Wykonanie takiego programu niewiele b¦dzie si¦ ró»ni¢ od realizacji programu z poprzedniego listingu czego
powodem jest brak zatrzymania aplikacji po jej realizacji. Jedn¡ z mo»liwo±ci zatrzymania jest jak wcze±niej
podano wykonanie programu bez jego kompilacji (o ile wcze±niej ta wersja programu zostaªa skompilowana).
Mo»na równie» posªu»y¢ si¦ znanym mechanizmem polegaj¡cym na oczekiwaniu na wprowadzenie znaków z
klawiatury po zako«czeniu realizacji programu. W tym celu posªu»y¢ si¦ nale»y metod¡ ReadLine() tak»e
dost¦pn¡ dla obiektu Console. Zasada odwoªania do tej metody jest identyczna jak w przypadku metody
WriteLine() tzn. wykorzystuje operator kropki.
using System;
class Program{
static void Main(){
Console.WriteLine("Pierwszy program");
Console.ReadLine();
}
}
Szczegóªowe omówienie obu metod b¦dzie tematem oddzielnego ¢wiczenia dotycz¡cego operacji wej±cia-
wyj±cia.
3.2 Kompilacja
Bardzo cz¦sto niewprawieni u»ytkownicy ±rodowiska VS 2008 b¡d¹ nieczytaj¡cy generowanych przez nie ko-
munikatów podczas uruchamiania napisanego programu, w rzeczywisto±ci ogl¡daj¡ efekt realizacji ostatniej
poprawnie napisanej wersji swojej aplikacji. Ma to miejsce, gdy» ±rodowisko VS 2008 w momencie rozpocz¦cia
debugowania (Debug, Start Debugging, skrót klawiszowy F5) kompiluje program, a w momencie napotkania
bª¦du w oknie Error List wy±wietla komunikat o napotkanym bª¦dzie, a dalej uruchamia ostatni¡ skompi-
lowan¡, poprawnie dziaªaj¡c¡ wersj¦ tego programu. Ci, którzy nie zorientuj¡ si¦, »e nast¡piª bª¡d, ogl¡daj¡
efekt realizacji starszej wersji programu, najcz¦±ciej realizuj¡cej inne zadania, ni» te które taki programista
usiªowaª do programu wprowadzi¢. Aby mie¢ pewno±¢, i» realizujemy program po ostatnich modykacjach z
uwag¡ nale»y ±ledzi¢ wynik kompilacji programu. Mo»na równie» posªu»y¢ si¦ menu Build i oferowanymi przez
nie operacjami:
•
Build nazwa_projektu kompilacja ostatnio zmienionych elementów projektu,
•
Rebuild nazwa_projektu kompilacja wszystkich elementów projektu,
•
Clean nazwa_projektu usuni¦cie wszystkich elementów projektu powstaªych w wyniki kompilacji.
Niezwykle przydatne podczas tworzenia aplikacji s¡ funkcje debuggera umo»liwiaj¡ce krokow¡ realizacj¦
programu (menu Debug pozycje Step Into, Step Over), zatrzymanie programu w ±ci±le okre±lonym miejscu
poprzez umieszczanie puªapek (menu Debug pozycje Toggle Breakpoint), obserwacj¦ zmiennych wykorzysty-
wanych w programie podczas jego fragmentarycznej realizacji (menu Debug pozycja Quick Watch, okna Watch
lub Locals dost¦pne wyª¡cznie podczas krokowej realizacji programu).
3.3 Komentarze
Bardzo cz¦sto dla uªatwienia zrozumienia programu oraz sensowno±ci u»ycia kolejnych instrukcji dodajemy
komentarze pozwalaj¡ce odnale¹¢ si¦ w programie ka»demu kto do niego si¦gnie, a nawet samym sobie, gdy» z
upªywem czasu sami stracimy nad nim kontrol¦. Komentarze pojawi¢ si¦ mog¡ w dowolnym miejscu programu.
S¡ one caªkowicie pomijane przez kompilator i nie s¡ dodawane do plików wynikowych.
4 Typy danych w C#
6
Komentarze s¡ tak»e bardzo przydatne je±li po dodaniu fragmentu kodu nast¦puje bª¡d kompilacji taki
fragment mo»na zamkn¡¢ w komentarz celem przywrócenia poprawnej kompilacji, a nast¦pnie zastanowi¢ si¦
gdzie tkwi bª¡d.
Mo»emy rozró»ni¢ dwa rodzaje komentarzy: liniowe (wierszowe) oraz blokowe. Komentarz liniowy wskazu-
jemy podwójnym znakiem slash // (pl. ci¦cie) za którym umieszczamy komentarz. W takim przypadku nie
wskazujemy ko«ca komentarza (koniec komentarza wskazuje automatycznie znak ko«ca linii, w której zostaª
on umieszczony). Natomiast chc¡c umie±ci¢ w programie komentarz blokowy konieczne jest wskazanie jego po-
cz¡tku i ko«ca przy czym pocz¡tek wskazuje kombinacja znaków /*, a koniec przestawiona para tych samych
znaków */. Komentarz blokowy (w przeciwie«stwie do liniowego) mo»e si¦ znale¹¢ równie» wewn¡trz wybranej
instrukcji. Komentarzy blokowych nie wolno zagnie»d»a¢.
Przykªady obu komentarzy pokazuje listing znanego programu zamieszczony poni»ej:
using System;
/* nasz
pierwszy
program
*/
class Program{
static void Main(){
Console.WriteLine/* np. tu*/("Pierwszy program"); // wy±wietlenie komunikatu
Console.ReadLine();
}
}
4 Typy danych w C#
Klasykacja typów danych w j¦zyku C# jest nast¦puj¡ca:
1. Typy warto±ciowe
(a) proste (podstawowe)
(b) wyliczeniowe (enumeracje)
(c) strukturalne
2. Typy referencyjne
(a) klasowe
(b) interfejsy
(c) tablice
3. Wska¹niki
Typy warto±ciowe s¡ strukturami przechowywanymi na stosie jako warto±ci (st¡d ich nazwa). Natomiast
warto±ci typów referencyjnych przechowywane s¡ na stercie (w pami¦ci rezerwowanej dynamicznie), a na stosie
znajduj¡ si¦ jedynie referencje tzn. wskazania do okre±lonych obiektów. Typów wska¹nikowych u»ywa si¦ za± do
jawnego manipulowania pami¦ci¡, cho¢ w j¦zyku C# ich u»yteczno±¢ jest niewielka.
Najcz¦±ciej podczas pisania prostych aplikacji posªugujemy si¦ typami podstawowymi, pozwalaj¡cymi wy-
konywa¢ operacje na liczbach, znakach czy ªa«cuchach znaków.
W±ród typów caªkowitoliczbowych nale»y wyró»ni¢:
5 Zmienne
7
Nazwa Zakres warto±ci Znaczenie
sbyte
−2
7
2
7
− 1
8-bitowa liczba ze znakiem
byte
0
2
8
− 1
8-bitowa liczba bez znaku
short
−2
15
2
15
− 1
16-bitowa liczba ze znakiem
ushort
0
2
16
− 1
16-bitowa liczba bez znaku
int
−2
31
2
31
− 1
32-bitowa liczba ze znakiem
uint
0
2
32
− 1
16-bitowa liczba bez znaku
long
−2
63
2
63
− 1
64-bitowa liczba ze znakiem
ulong
0
2
64
− 1
64-bitowa liczba bez znaku
Do typów zmiennoprzecinkowych nale»¡ natomiast:
Nazwa
Zakres warto±ci
Znaczenie
oat
±1, 5 · 10
−45
±3, 4 · 10
38
7 miejsc po przecinku
double
±5 · 10
−324
±1, 7 · 10
308
15 lub 16 cyfr
decimal ±1, 0 · 10
−28
±7, 9 · 10
28
28 lub 29 cyfr
Typ decimal sªu»y do prezentacji liczb stosunkowo niewielkich ze znaczn¡ precyzj¡.
Typ znakowy char w j¦zyku C# jest 16-to bitowy i zawiera znaki Unicode. Jest to komputerowy zestaw
znaków, maj¡cy w zamierzeniu obejmowa¢ wszystkie pisma u»ywane na ±wiecie. De facto ka»dy znak reprezen-
towany jest 16-to bitow¡ liczb¡, dlatego cz¦sto zalicza si¦ ten typ do typów caªkowitoliczbowych. Chc¡c jednak
posªugiwa¢ si¦ znakami, a nie kodami znaków, dany symbol nale»y umie±ci¢ w apostrofach np. 'a' oznacza
maª¡ liter¦ a.
Przydatnym w pewnych zastosowaniach mo»e by¢ typ bool obejmuj¡cy warto±ci logiczne prawda/faªsz czyli
true/false. Ten typ cz¦sto uto»samiany jest z wyra»eniami logicznymi oraz testowaniem warunków w instruk-
cjach warunkowych. W przeciwie«stwie jednak do j¦zyka C typu tego nie mo»na ª¡czy¢ z warto±ciami liczbowymi
0
, 6= 0.
Omówienie pozostaªych typów mo»na znale¹¢ w literaturze.
5 Zmienne
Zmienna (dost¦pna poprzez identykator) reprezentuje miejsce w pami¦ci. Ka»da zmienna posiada swój typ,
który okre±la zbiór mo»liwych warto±ci i operacji. C# jest j¦zykiem o ±cisªej typizacji, zbiór mo»liwych ope-
racji dost¦pnych dla danego typu/zmiennej jest okre±lany ju» podczas kompilacji, a zmienna jest dost¦pna
tylko poprzez powi¡zany z ni¡ typ. Zmienne deklarujemy wedªug wzoru: modyfikatory typ identyfikator
= wartPocz;, przy czym modykatory oraz warto±¢ pocz¡tkowa nie s¡ wymagane [2]. Przykªadowa deklaracja
zmiennej o nazwie a typu caªkowitego, z nadaniem jej warto±ci pocz¡tkowej mo»e mie¢ posta¢: int a = 10;
W±ród dost¦pnych modykatorów typów nale»y wymieni¢:
•
static zmienna statyczna
•
const staªa w programie
•
readonly tylko do odczytu
•
volatile tzw. typ nietrwaªy
Dokªadniejsz¡ charakterystyk¦ modykatorów typów mo»na równie» odnale¹¢ we wskazanych w instrukcji po-
zycjach bibliogracznych.
Deklaracj¦ wi¦kszej liczby zmiennych tego samego typu przeprowadzi¢ mo»na przy pomocy zwartego za-
pisu postaci: modyfikatory typ identyfikator1,identyfikator2,identyfikator3;. W deklaracji takiej
6 Program ¢wiczenia
8
ka»demu identykatorowi z osobna mo»na nada¢ po»¡dan¡ warto±¢ wcze±niej pokazan¡ metod¡. Inaczej ni»
w j¦zyku C deklaracje zmiennych mog¡ wyst¡pi¢ gdziekolwiek w programie, a nie na jego pocz¡tku. Daje to
olbrzymi¡ wygod¦ programi±cie, który deklaruje zmienn¡ wówczas, gdy na danym etapie pisania kodu wydaje
si¦ ona niezb¦dna. Przykªad zamieszczono poni»ej:
using System;
class Program{
static void Main(){
Console.WriteLine("Pierwszy program");
Console.ReadLine();
int a = 13;
Console.WriteLine(a);
Console.ReadLine();
}
}
6 Program ¢wiczenia
W programie ¢wiczenia przewiduje si¦:
1. Zapoznanie studentów z tworzeniem aplikacji konsolowych w j¦zyku C# przy pomocy ±rodowiska Visual
Studio 2008
2. Utworzenie pustego projektu, a nast¦pnie dodanie do niego pliku z metod¡ Main.
3. Napisanie prostego programu wy±wietlaj¡cego na ekranie u»ytkownika komunikat sªowny.
4. Rozbudowa programu o cz¦±¢ obejmuj¡c¡ deklaracj¦ zmiennych oraz podj¦cie próby wy±wietlenia ich
warto±ci na ekranie u»ytkownika.
5. Rozbudowa projektów o dodatkowe klasy (pliki).
6. Wiele projektów (project) w jednym rozwi¡zaniu (solution), przeª¡czanie aktywnego projektu.
Literatura
[1] Hejlsberg A., Wiltamuth S., Golde P., Microsoft C# Language Specication, Addison-Wesley, 2004.
[2] Dusi«ski D.Kurs C# (ver 2.0), http://www.toya.net.pl/~daniel_d/csharp/index.html
[3] http://aei.polsl.pl/informacje/program-msdn-academic-alliance.html
[4] Liberty J. (Tªumaczenie: Walczak T.), C#. Programowanie, Helion, 2005.
[5] Lis M., C#. Praktyczny kurs. Helion, 2007,