You are on page 1of 31

C# 2005.

Warsztat
programisty
Autor: Adrian Kingsley-Hughes, Kathie Kingsley-Hughes
Tumaczenie:Wojciech Demski
ISBN: 978-83-246-1065-5
Tytu oryginau: C# 2005 Programmers Reference
Format: B5, stron: 392
oprawa twarda

Wyjtkowy podrcznik jzyka C#


Elementy jzyka i podstawowe koncepcje programistyczne
Techniki tworzenia najwyszej klasy aplikacji dla platformy .NET
Metody poprawy bezpieczestwa i wydajnoci aplikacji

Jzyk C#, pomimo stosunkowo krtkiej obecnoci na rynku, zyska ogromn


popularno i jest wykorzystywany przez wielu programistw. Trudno si temu dziwi
ten czcy w sobie najlepsze cechy Javy i C++ obiektowy jzyk programowania
jest niezwykle uniwersalny. Mona wykorzysta go w niemal kadym projekcie
programw dla systemu Windows, dynamicznych witryn internetowych w technologii
ASP.NET oraz aplikacji mobilnych dla platformy PocketPC. Prosta skadnia,
rozbudowane mechanizmy obsugi wyjtkw i dostp do ogromnej biblioteki klas .NET
sprawiaj, e C# jest doskonaym narzdziem.
Ksika C# 2005. Warsztat programisty to poczenie kursu i podrcznika
programowania w tym jzyku. Czytajc j, opanujesz zarwno podstawy C#, jak
i zaawansowane zagadnienia zwizane z tworzeniem bezpiecznych i wydajnych
aplikacji. Poznasz typy danych, zasady stosowania zmiennych oraz skadni instrukcji
i wyrae. Przeczytasz o programowaniu obiektowym, typach generycznych, obsudze
wyjtkw i technikach programowania w C#. Znajdziesz tu rwnie omwienie
gramatyki jzyka C#, konwencji nazewniczych i zasad umieszczania komentarzy
w dokumentacji XML.

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Narzdzia programistyczne
Struktura jzyka C#
Typy danych
Wyraenia i instrukcje
Przestrzenie nazw
Klasy i obiekty
Typy wyliczeniowe
Obsuga wyjtkw
Typy generyczne

Poznaj nowoczesne metody tworzenia aplikacji

Spis treci
O autorach .................................................................................................................................................. 15
Wprowadzenie ........................................................................................................................................... 17
Rozdzia 1. Czym jest C#? ..........................................................................................................................23
Nazwa ......................................................................................................................... 23
Oglny rzut oka na C# .................................................................................................. 23
Historia .................................................................................................................. 24
C# i CLR ................................................................................................................ 24
Wzmianka o .NET .................................................................................................... 25
Standardy ............................................................................................................... 25
Inne implementacje ................................................................................................. 25
Przykadowy kod C# ...................................................................................................... 26
Korzyci z nauki programowania w C# ............................................................................ 28
Podsumowanie ............................................................................................................ 28

Rozdzia 2. Pocztki pracy z C# ...............................................................................................................29


Pocztki pracy z C# s tasze, ni mogoby si wydawa! ................................................ 29
Tanie opcje ............................................................................................................. 29
Jak pisa kod C#, stosujc bezpatne narzdzia ........................................................ 32
Tanie narzdzie, ktre uatwia ycie! .............................................................................. 35
Alternatywne edytory tekstowe i narzdzia C# ................................................................. 37
Narzdzia komercyjne: Visual Studio i Visual C# ............................................................. 37
Podsumowanie ............................................................................................................ 38

Rozdzia 3. Oglny rzut oka na C# ...........................................................................................................39


C# .............................................................................................................................. 39
Podstawy C# ................................................................................................................ 39
Czytanie rdowego kodu C# ................................................................................... 40
Typy ............................................................................................................................ 41
Typy wartoci .......................................................................................................... 41
Typy referencyjne .................................................................................................... 41
Typy predefiniowane ................................................................................................ 42
Przecianie ........................................................................................................... 44
Przeksztacenia ....................................................................................................... 44
Typy tablicowe ........................................................................................................ 45
Zmienne i parametry ..................................................................................................... 45
Wyraenia .................................................................................................................... 47
Instrukcje .................................................................................................................... 48

C# 2005. Warsztat programisty


Klasy ........................................................................................................................... 49
Stae ...................................................................................................................... 50
Pola ....................................................................................................................... 50
Metody ................................................................................................................... 50
Waciwoci ............................................................................................................ 51
Zdarzenia ............................................................................................................... 51
Operatory ............................................................................................................... 51
Indeksatory ............................................................................................................ 51
Konstruktory instancji .............................................................................................. 51
Destruktory ............................................................................................................ 52
Konstruktory statyczne ............................................................................................ 52
Dziedziczenie .......................................................................................................... 52
Klasy statyczne ....................................................................................................... 52
Struktury ..................................................................................................................... 53
Interfejsy ..................................................................................................................... 53
Delegacje .................................................................................................................... 53
Typy wyliczeniowe ......................................................................................................... 54
Typy generyczne ........................................................................................................... 54
Iteratory ...................................................................................................................... 54
Typy dopuszczajce warto pust ................................................................................. 55
Podsumowanie ............................................................................................................ 55

Rozdzia 4. Struktura jzyka C# ..............................................................................................................57


Programy C# ................................................................................................................ 57
Gramatyka ................................................................................................................... 59
Dwuznacznoci gramatyczne .................................................................................... 59
Analiza leksykalna ................................................................................................... 61
Podsumowanie ............................................................................................................ 77

Rozdzia 5. Koncepcje jzyka C# .............................................................................................................79


Uruchamianie aplikacji .................................................................................................. 79
Zamykanie aplikacji ...................................................................................................... 80
Deklaracje w C# ........................................................................................................... 80
Skadowe .................................................................................................................... 83
Skadowe przestrzeni nazw ...................................................................................... 83
Skadowe struktur ................................................................................................... 83
Skadowe wyliczeniowe ............................................................................................ 83
Skadowe klas ........................................................................................................ 83
Skadowe interfejsw .............................................................................................. 84
Skadowe tablic ...................................................................................................... 85
Skadowe delegacji ................................................................................................. 85
Dostp do skadowych .................................................................................................. 85
Deklarowana dostpno ......................................................................................... 85
Sygnatury .................................................................................................................... 86
Sygnatury indeksatorw ........................................................................................... 86
Sygnatury konstruktorw instancji ............................................................................ 86
Sygnatury metod ..................................................................................................... 86
Sygnatury operatorw .............................................................................................. 87
Sygnatury i przecianie .......................................................................................... 87
Zasig ......................................................................................................................... 88
Nazwy przestrzeni nazw i typw ..................................................................................... 89

Spis treci

Zarzdzanie pamici w C# ........................................................................................... 89


Podsumowanie ............................................................................................................ 90

Rozdzia 6. Typy ......................................................................................................................................... 91


Trzy typy typw ............................................................................................................. 91
Rnice pomidzy typami wartociowymi i referencyjnymi ........................................... 91
System typw w C# ...................................................................................................... 92
Typy wartociowe ......................................................................................................... 92
System.ValueType ................................................................................................... 94
Konstruktory domylne ............................................................................................ 94
Typy strukturalne .................................................................................................... 94
Typy proste ............................................................................................................. 95
Typy cakowitoliczbowe ............................................................................................ 96
Okrelanie typw .................................................................................................... 97
Typy zmiennoprzecinkowe ........................................................................................ 98
Typy dziesitne ....................................................................................................... 98
Typ bool ................................................................................................................. 99
Typy wyliczeniowe ................................................................................................... 99
Typy referencyjne ......................................................................................................... 99
Typy klas .............................................................................................................. 100
Typ object ............................................................................................................ 101
Typ string ............................................................................................................. 101
Typy tablicowe ...................................................................................................... 101
Typy delegacji ....................................................................................................... 101
Typ null ................................................................................................................ 101
Pakowanie i odpakowywanie .................................................................................. 101
Typy nullable ......................................................................................................... 102
Podsumowanie .......................................................................................................... 103

Rozdzia 7. Zmienne ................................................................................................................................. 105


Czym s zmienne? ..................................................................................................... 105
Nie wszystkie zmienne tworzy si w ten sam sposb ............................................... 105
Kategorie zmiennych .................................................................................................. 106
Zmienne statyczne ................................................................................................ 107
Elementy tablicy .................................................................................................... 107
Zmienne instancji .................................................................................................. 108
Parametry wartoci ............................................................................................... 109
Parametry referencyjne .......................................................................................... 109
Parametry wyjciowe ............................................................................................. 110
Zmienne lokalne ................................................................................................... 111
Wartoci domylne ..................................................................................................... 111
Przypisania niewtpliwe .............................................................................................. 111
Zmienne zainicjalizowane ....................................................................................... 112
Zmienne niezainicjalizowane .................................................................................. 112
Podsumowanie .......................................................................................................... 121

Rozdzia 8. Przeksztacenia ................................................................................................................... 123


Przeksztacenia niejawne ............................................................................................ 123
Przeksztacenia tosamociowe ............................................................................. 124
Niejawne przeksztacenia liczbowe ......................................................................... 124
Niejawne przeksztacenia wyliczeniowe ................................................................... 125
Niejawne przeksztacenia referencyjne .................................................................... 125

C# 2005. Warsztat programisty


Przeksztacenia typu opakowywanie ........................................................................ 126
Niejawne przeksztacenia parametrw typw ........................................................... 127
Niejawne przeksztacenia wyrae staych ............................................................... 127
Niejawne przeksztacenia definiowane przez uytkownika ......................................... 127
Przeksztacenia jawne ................................................................................................. 128
Jawne przeksztacenia liczbowe .............................................................................. 128
Jawne przeksztacenia wyliczeniowe ....................................................................... 130
Jawne przeksztacenia referencyjne ........................................................................ 131
Przeksztacenia typu odpakowywanie ...................................................................... 132
Jawne przeksztacenia parametrw typu .................................................................. 132
Jawne przeksztacenia definiowane przez uytkownika .............................................. 132
Przeksztacenia standardowe ...................................................................................... 132
Standardowe przeksztacenia niejawne ................................................................... 133
Standardowe przeksztacenia jawne ........................................................................ 133
Przeksztacenia definiowane przez uytkownika ....................................................... 133
Przeksztacenia metod anonimowych ........................................................................... 134
Przeksztacenia grup metod ........................................................................................ 134
Przeksztacenia typu null ............................................................................................. 135
Przeksztacenia dopuszczajce warto pust ......................................................... 135
Podsumowanie .......................................................................................................... 136

Rozdzia 9. Wyraenia ............................................................................................................................. 137


Klasyfikacja wyrae ................................................................................................... 137
Wyniki wyrae ..................................................................................................... 138
Wartoci wyrae ....................................................................................................... 138
Wyraenia i operatory ................................................................................................. 138
Trzy rodzaje operatorw ......................................................................................... 139
Priorytet i czno operatorw ............................................................................... 139
Przecianie operatorw ........................................................................................ 141
Operatory rozszerzone ........................................................................................... 144
Wyszukiwanie skadowej ............................................................................................. 146
Typy bazowe ......................................................................................................... 147
Skadowe funkcyjne .................................................................................................... 147
Wyraenia podstawowe ............................................................................................... 151
Literay ................................................................................................................. 152
Nazwy proste ........................................................................................................ 152
Wyraenia nawiasowe ............................................................................................ 152
Dostp do skadowej ............................................................................................. 152
Wyraenia wywoania ............................................................................................. 153
Dostp do elementu .............................................................................................. 154
Wyraenie wartoci domylnej ................................................................................ 157
Metody anonimowe ............................................................................................... 157
Wyraenia jednoargumentowe ..................................................................................... 158
Wyraenia rzutowania ................................................................................................. 158
Operatory arytmetyczne .............................................................................................. 158
Operatory przesunicia ............................................................................................... 159
Operatory relacyjne ..................................................................................................... 159
Operatory logiczne ...................................................................................................... 160
Logiczne operatory warunkowe .................................................................................... 161
Operator null coalescing ............................................................................................. 161
Operatory przypisania ................................................................................................. 162

Spis treci

Wyraenie .................................................................................................................. 163


Wyraenia stae .......................................................................................................... 163
Wyraenia boolowskie ................................................................................................. 165
Podsumowanie .......................................................................................................... 166

Rozdzia 10. Instrukcje ............................................................................................................................ 167


Czym s instrukcje? ................................................................................................... 167
Instrukcje C# ............................................................................................................. 169
Punkt kocowy i osigalno .................................................................................. 170
Punkt kocowy ...................................................................................................... 170
Osigalno ......................................................................................................... 170
Bloki kodu ................................................................................................................. 172
Listy instrukcji ...................................................................................................... 172
Instrukcje puste ......................................................................................................... 173
Instrukcje etykietowane .............................................................................................. 173
Instrukcje deklaracyjne ............................................................................................... 174
Deklaracje zmiennych lokalnych ............................................................................. 174
Deklaracje staych lokalnych .................................................................................. 175
Instrukcje wyraeniowe ............................................................................................... 176
Instrukcje wyboru .................................................................................................. 176
Instrukcje iteracyjne .............................................................................................. 182
Instrukcje skoku ................................................................................................... 184
Instrukcja using .................................................................................................... 187
Instrukcja yield ..................................................................................................... 188
Podsumowanie .......................................................................................................... 189

Rozdzia 11. Przestrzenie nazw ...............................................................................................................191


Czym s przestrzenie nazw? ........................................................................................ 191
Organizowanie klas ............................................................................................... 191
Kontrolowanie zasigu ........................................................................................... 192
Jednostki kompilacji ................................................................................................... 192
Deklaracje przestrzeni nazw ........................................................................................ 193
Dyrektywy uycia synonimu zewntrznego ..................................................................... 194
Dyrektywy uycia ........................................................................................................ 195
Skadowe przestrzeni nazw .................................................................................... 196
Deklaracje typw ................................................................................................... 196
Kwalifikowane skadowe synonimw ....................................................................... 197
Podsumowanie .......................................................................................................... 199

Rozdzia 12. Klasy .................................................................................................................................... 201


Czym s klasy? .......................................................................................................... 201
Deklaracje klas .......................................................................................................... 201
Modyfikatory klas .................................................................................................. 202
Wskazanie klasy bazowej ....................................................................................... 203
Klasy bazowe ........................................................................................................ 203
Implementacje interfejsw ..................................................................................... 203
Ciao klasy ........................................................................................................... 204
Deklaracje czciowe ............................................................................................ 204
Skadowe klasy .......................................................................................................... 204
Dziedziczenie ........................................................................................................ 206
Modyfikator new ................................................................................................... 206
Modyfikatory dostpu ............................................................................................ 206

10

C# 2005. Warsztat programisty


Skadowe statyczne i instancji ................................................................................ 206
Stae .................................................................................................................... 207
Pola .......................................................................................................................... 208
Pola statyczne i instancji ....................................................................................... 209
Pola readonly ........................................................................................................ 209
Metody ...................................................................................................................... 210
Parametry metody ................................................................................................. 211
Metody statyczne i instancji ................................................................................... 212
Metody wirtualne .................................................................................................. 212
Metody przesaniajce ........................................................................................... 213
Metody ostateczne ................................................................................................ 213
Metody abstrakcyjne ............................................................................................. 213
Ciao metody ........................................................................................................ 213
Waciwoci ............................................................................................................... 214
Waciwoci statyczne i instancji ............................................................................ 215
Akcesory .............................................................................................................. 215
Akcesory wirtualne, ostateczne, przesaniajce i abstrakcyjne .................................. 216
Zdarzenia .................................................................................................................. 216
Zdarzenia jako pola ............................................................................................... 217
Zdarzenia statyczne i instancji ................................................................................ 217
Akcesory wirtualne, ostateczne, przesaniajce i abstrakcyjne .................................. 218
Indeksatory ................................................................................................................ 218
Operatory .................................................................................................................. 220
Operatory jednoargumentowe ................................................................................. 221
Operatory dwuargumentowe ................................................................................... 222
Operatory przeksztacenia ...................................................................................... 222
Konstruktory instancji ................................................................................................. 222
Konstruktory statyczne ............................................................................................... 223
Destruktory ................................................................................................................ 224
Podsumowanie .......................................................................................................... 224

Rozdzia 13. Struktury ........................................................................................................................... 225


Czym s struktury? ..................................................................................................... 225
Deklaracje struktur ..................................................................................................... 226
Modyfikatory struktury ........................................................................................... 227
Interfejsy struktury ................................................................................................ 227
Ciao struktury ...................................................................................................... 227
Skadowe struktury ................................................................................................ 228
Rnice midzy klas a struktur ................................................................................. 228
Semantyka wartoci .............................................................................................. 229
Dziedziczenie ........................................................................................................ 229
Przypisania ........................................................................................................... 230
Wartoci domylne ................................................................................................ 230
Opakowywanie i rozpakowywanie ............................................................................ 230
this ...................................................................................................................... 231
Inicjalizatory pl .................................................................................................... 231
Konstruktory ......................................................................................................... 231
Destruktory .......................................................................................................... 231
Konstruktory statyczne .......................................................................................... 232
Kiedy korzysta ze struktur .......................................................................................... 232
Podsumowanie .......................................................................................................... 232

Spis treci

11

Rozdzia 14. Tablice ................................................................................................................................. 233


Czym jest tablica? ...................................................................................................... 233
Typy tablicowe ........................................................................................................... 235
Typ System.Array .................................................................................................. 236
Tworzenie tablic ......................................................................................................... 236
Dostp do elementw tablicy ................................................................................. 237
Skadowe tablic .................................................................................................... 237
Kowariancja tablic ................................................................................................. 237
Inicjalizatory tablic ................................................................................................. 238
Podsumowanie .......................................................................................................... 240

Rozdzia 15. Interfejsy ............................................................................................................................. 241


Czym jest interfejs? .................................................................................................... 241
Definiowanie interfejsu ............................................................................................... 242
Deklaracje interfejsw ................................................................................................ 242
Modyfikatory ......................................................................................................... 243
Jawne interfejsy bazowe ........................................................................................ 243
Ciao interfejsu ..................................................................................................... 244
Skadowe interfejsu ............................................................................................... 244
Metody interfejsu .................................................................................................. 244
Waciwoci interfejsu ........................................................................................... 244
Zdarzenia interfejsu ............................................................................................... 245
Podsumowanie .......................................................................................................... 245

Rozdzia 16. Typy wyliczeniowe ............................................................................................................. 247


Deklaracje typw wyliczeniowych ................................................................................. 248
Modyfikatory typw wyliczeniowych .............................................................................. 249
Skadowe typw wyliczeniowych ................................................................................... 250
Przestroga przed referencjami cyklicznymi .................................................................... 251
System.Enum ............................................................................................................ 251
Wartoci i operacje typw wyliczeniowych ................................................................ 252
Podsumowanie .......................................................................................................... 252

Rozdzia 17. Delegacje ............................................................................................................................ 253


Delegacje w dziaaniu ................................................................................................. 253
Deklaracje delegacji ................................................................................................... 254
Modyfikatory ......................................................................................................... 254
Deklarowanie delegacji .......................................................................................... 255
Lista wywoawcza .................................................................................................. 255
Tworzenie instancji delegacji .................................................................................. 256
Podsumowanie .......................................................................................................... 257

Rozdzia 18. Wyjtki ................................................................................................................................ 259


Zgaszanie wyjtkw ................................................................................................... 259
System.Exception ....................................................................................................... 260
Typowe klasy wyjtkw ............................................................................................... 260
Obsuga wyjtkw ....................................................................................................... 261
Co si dzieje, gdy klauzula catch nie zostaje odnaleziona? ....................................... 261
Podsumowanie .......................................................................................................... 262

12

C# 2005. Warsztat programisty


Rozdzia 19. Atrybuty .............................................................................................................................. 263
Wprowadzenie do atrybutw ........................................................................................ 263
Klasy atrybutw .......................................................................................................... 264
Parametry pozycyjne i nazwane .............................................................................. 264
Uycie atrybutw ................................................................................................... 264
Typy parametrw atrybutu ...................................................................................... 265
Specyfikacja atrybutw ............................................................................................... 266
Instancje atrybutw .................................................................................................... 269
Kompilacja atrybutw ............................................................................................ 269
Odczytywanie instancji atrybutu podczas wykonywania programu ............................... 269
Atrybuty zastrzeone ................................................................................................... 270
Atrybut Conditional ................................................................................................ 270
Podsumowanie .......................................................................................................... 272

Rozdzia 20. Typy generyczne ............................................................................................................... 275


Typy generyczne w C# i szablony w C++ ....................................................................... 275
Zalety typw generycznych ..................................................................................... 276
Deklaracje klas generycznych ...................................................................................... 276
Parametry typu ..................................................................................................... 277
Rnice parametrw typu ....................................................................................... 278
Typ instancji ......................................................................................................... 279
Skadowe klas generycznych .................................................................................. 279
Pola statyczne w klasach generycznych ................................................................... 280
Konstruktory statyczne w klasach generycznych ....................................................... 280
Dostp do skadowych chronionych ........................................................................ 281
Przecianie w klasach generycznych ...................................................................... 281
Operatory w klasach generycznych .......................................................................... 281
Deklaracje struktur generycznych ................................................................................. 282
Deklaracje interfejsw generycznych ............................................................................ 282
Jawne implementacje skadowych interfejsu ................................................................. 283
Deklaracje delegacji generycznych ............................................................................... 283
Typy konstruowane ..................................................................................................... 283
Argumenty typu ..................................................................................................... 284
Typy otwarte i zamknite ....................................................................................... 284
Skadowe typw konstruowanych ............................................................................ 284
Stosowanie dyrektyw uycia synonimw .................................................................. 285
Metody generyczne ............................................................................................... 285
Gdzie nie uywa si typw generycznych ....................................................................... 287
Ograniczenia .............................................................................................................. 288
Podsumowanie .......................................................................................................... 291

Rozdzia 21. Iteratory ............................................................................................................................. 293


Blok iteratora ............................................................................................................. 294
Bloki iteratora i bdy czasu kompilacji ................................................................... 295
Interfejsy enumeratora .......................................................................................... 295
Interfejsy wyliczeniowe .......................................................................................... 295
Typ yield ............................................................................................................... 296
This ..................................................................................................................... 296
Obiekty enumeratora .................................................................................................. 296
Metoda MoveNext ................................................................................................. 297
Przerwanie wykonywania kodu ................................................................................ 298

Spis treci

13

Waciwo Current ............................................................................................... 298


Metoda Dispose ................................................................................................... 299
Obiekty przeliczalne .................................................................................................... 300
Metoda GetEnumerator ......................................................................................... 300
Podsumowanie .......................................................................................................... 301

Rozdzia 22. Kod nienadzorowany ......................................................................................................... 303


Czym jest kod nienadzorowany? .................................................................................. 303
Zalety i wady kodu nienadzorowanego .......................................................................... 304
Zalety kodu nienadzorowanego ............................................................................... 304
Wady kodu nienadzorowanego ............................................................................... 304
Konteksty kodu nienadzorowanego .............................................................................. 305
Podstawowe informacje o wskanikach ........................................................................ 306
Wskaniki void ...................................................................................................... 307
Operatory wskanikowe ......................................................................................... 307
Kod nienadzorowany w dziaaniu .................................................................................. 308
Stosowanie modyfikatora fixed ............................................................................... 309
Operator sizeof .......................................................................................................... 310
Uycie sowa kluczowego stackalloc ............................................................................. 311
Kompilowanie kodu nienadzorowanego ........................................................................ 312
Podsumowanie .......................................................................................................... 312

Dodatek A Gramatyka jzyka C# ........................................................................................................... 313


Dodatek B Konwencje nazewnicze ........................................................................................................ 349
Dodatek C Biblioteka standardowa ....................................................................................................... 357
Dodatek D Przenaszalno ..................................................................................................................... 371
Dodatek E Komentarze dokumentacyjne XML ...................................................................................... 375
Skorowidz ............................................................................................................................................... 379

Struktura jzyka C#
Aby pisa dobre programy w C#, naley w peni zrozumie struktur tego jzyka. W rozdziale tym omwimy jzykow, czyli leksykaln struktur programw napisanych w C#.
Oto kolejno, w jakiej bdziemy przedstawia tematy:
Q

Programy C#

Gramatyka

Zakoczenia wierszy

Komentarze

Biae znaki

Tokeny

Sowa kluczowe

Dyrektywy

Programy C#
Kady program C# tworzony jest z jednego bd wielu plikw rdowych. Te pliki, zwane te jednostkami kompilacji, mog by odrbnymi plikami tekstowymi lub te plikami
zawartymi wewntrz zintegrowanego rodowiska IDE (ang. Integrated Development Environment), jak Visual Studio.
Jednostki kompilacyjne zawieraj uporzdkowane sekwencje znakw Unicode (okrne
okrelenie tekstu) i aby zapewni maksymaln przenaszalno, wszystkie pliki rdowe
powinny by zakodowane w standardzie UTF-8. Korzystajc z prostego edytora tekstowego (jakim jest Notatnik) lub rodowiska programistycznego specyficznego dla C#, moemy
mie pewno, e kod otrzyma poprawny format.

58

C# 2005. Warsztat programisty


Jednostka kompilacji skada si z:
Q

Zera lub wicej dyrektyw using

Zera lub wicej atrybutw globalnych

Zera lub wicej deklaracji skadowych przestrzeni nazw

Atrybut jest obiektem reprezentujcym dane, ktre zamierzamy powiza z elementem programu, podczas gdy element, z ktrym wiemy ten atrybut, nazywamy adresatem atrybutu.
Wszystkie elementy jednostki kompilacji peni okrelon rol:
Q

Dyrektywy using. Umoliwiaj uycie przestrzeni nazw (ktre wykorzystuje si


do logicznego rozmieszczania klas, struktur, interfejsw, wylicze i delegacji)
oraz typw zdefiniowanych w innych przestrzeniach nazw. To wpywa na atrybuty
i deklaracje skadowych przestrzeni nazw jednostki kompilacji. Dyrektywa using
zawarta w jednej jednostce kompilacji nie ma wpywu na pozostae jednostki.

Atrybuty globalne. Umoliwiaj zdefiniowanie atrybutw dla caego projektu.


Asemblacje i moduy peni rol fizycznych pojemnikw na typy (lub jako miejsce
dla kodu; nieco pniej powiemy o tym bardziej szczegowo). Asemblacja moe
skada si z kilku odrbnych moduw lub, w przypadku prostszych projektw,
z pojedynczego.

Deklaracje skadowych przestrzeni nazw. Tworz jedn deklaracj przestrzeni


zwanej globaln przestrzeni nazw.

Gdy program C# jest kompilowany, wwczas wszystkie jednostki kompilacji przetwarzane


s razem, co oznacza, e s powizane zalenociami (jeeli program skada si z wicej ni
jednej jednostki kompilacji, to kompilator, aby by w stanie poprawnie skompilowa kod
rdowy, musi mie dostp do wszystkich jednostek).
Kompilacja programu C# przebiega w trzech etapach:
Q

Transformacja. Ten etap polega na przeksztaceniu kodu na zbir znakw


Unicode (ze standardu, w ktrym kod zawarty w jednostkach kompilacji zosta
zapisany i zakodowany).

Analiza leksykalna. Jest to proces przeksztacania znakw Unicode w strumie


tokenw.

Analiza syntaktyczna. Na tym etapie, poprzedzajcym konwersj na posta


wykonywaln, strumieniowi tokenw nadawany jest format Microsoft
Intermediate Language (MSIL).

W C# wyrnia si kilka rodzajw tokenw:


Q

Identyfikatory

Sowa kluczowe

Literay

Operatory

Separatory

Rozdzia 4. Q Struktura jzyka C#

59

Biae znaki i komentarze nie s tokenami.


Kompilator powinien by w stanie przeksztaci jednostki kompilacji zapisane w formacie
Unicode lub pliki rdowe zakodowane w standardzie UTF-8 na posta sekwencji znakw
Unicode. Moe si zdarzy, e kompilator bdzie zdolny skompilowa jednostki kompilacji
zakodowane przy uyciu innych schematw (na przykad UTF-16 czy UTF-32), ale nie naley na to liczy.

Gramatyka
W jzyku C# stosuje si gramatyk dwojakiego rodzaju:
Q

Gramatyk leksykaln. Okrela sposb, w jaki znaki Unicode formuj:


Q

Zakoczenia wierszy

Biae znaki

Komentarze

Tokeny

Dyrektywy preprocesora

Gramatyk syntaktyczn. Ten typ gramatyki okrela schemat czenia tokenw,


ktre powstay na podstawie regu gramatyki leksykalnej, w programy C#.

Dwuznacznoci gramatyczne
W kadym jzyku programowania mona napotka pewne dwuznacznoci. Dla przykadu
rozwamy takie oto wyraenie:
F(X<Y, Z>(5));

To proste wyraenie mona zinterpretowa na dwa sposoby:


1.

Jako wywoanie F z dwoma argumentami: X<Y i Z>(5)

2. Jako wywoanie F z jednym argumentem, ktrym jest wywoanie metody


generycznej X majcej dwa argumenty typu (czyli argumenty, ktre po prostu

s typami) oraz jeden argument zwyky.


Na szczcie istniej pewne reguy, wedug ktrych postpuje kompilator, rozstrzygajc
takie niejednoznacznoci. Napotykajc kod, jak w powyszym przykadzie (gdzie mamy
sekwencj tokenw tworzcych list argumentw typu), kompilator zwraca uwag przede
wszystkim na token znajdujcy si bezporednio za znakiem zamykajcym >. Jeli jest to
jeden z nastpujcych tokenw:
Q

60

C# 2005. Warsztat programisty


Q

==

!=

lista argumentw typu definiuje cz prostej nazwy, dostp do skadowej lub dostp do
wskanika poprzedzajcego i wszystkie dalsze opcje s odrzucane.
Jeli nastpnym tokenem jest token, ktrego nie ma na powyszym wykazie, to lista argumentw typu nie definiuje czci nazwy, dostpu do skadowej ani dostpu do wskanika
poprzedzajcego.
Powysza regua nie odnosi si do parsowania listy argumentw typu w przestrzeni
nazw czy nazwach typw.
Wracajc do naszego wczeniejszego, do niejednoznacznego przykadu:
F(X<Y, Z>(5));

Zgodnie z reguami, ktre wymienilimy wczeniej, zapis ten zostanie zinterpretowany jako
wywoanie F z jednym argumentem, ktry stanowi wywoanie metody generycznej X, o dwch
argumentach typw i jednym argumencie zwykym.
Oto dwa nastpne przykady wyrae, ktre zostan zinterpretowane jako wywoanie F z dwoma argumentami:
F(X<Y, Z>5);
F((X<Y, Z>>5);

Omwmy inne wyraenie:


X = F<Y> + Z;

Wyraenie to z perspektywy uytych operatorw zostanie zinterpretowane jako:


Q

Operator mniejszy ni <

Operator wikszy ni >

Unarny operator +

Inna forma zapisu powyszego wyraenia wyglda tak:


X = (F < Y) > (+Z);

Rozdzia 4. Q Struktura jzyka C#

61

Analiza leksykalna
Kady plik rdowy programu C# musi by zgodny z nastpujcym gramatycznym wzorcem leksykalnym:
wejcie:
wejcie-sekcjaopcj
wejcie-sekcja:
wejcie-sekcja-cz
wejcie-sekcja wejcie-sekcja-cz
wejcie-sekcja-cz:
elementy wejcioweopcj
dyrektywa-pp
elementy-wejciowe
element-wejciowy
elementy-wejciowe

nowy-wiersz

wejcie-element

wejcie-element:
biay znak
komentarz
token

Leksykaln struktur jednostki kompilacji C# tworzy pi elementw podstawowych. S to:


Q

Zakoczenia wierszy

Biae znaki

Komentarze

Tokeny

Dyrektywy preprocesora

Spord tych elementw jedynie tokeny maj znaczenie z punktu widzenia gramatyki syntaktycznej dowolnego programu C# (z wyjtkiem sytuacji, gdy token > wystpuje cznie
z innym tokenem, tworzc z nim operator). Kiedy kompilator dokonuje leksykalnego przetwarzania jednostki kompilacji, to traktuje plik jako seri tokenw, ktre stanowi wejcie
dla pniejszego przetwarzania syntaktycznego. Zakoczenia wierszy, biae znaki i komentarze oddzielajce token y s elementami wycznie leksykalnymi i nie maj adnego wpywu na skadni programu C#. Podobnie dyrektywy preprocesora su tylko do omijania
fragmentw kodu w pliku rdowym i jeli chodzi o skadni, take nie maj znaczenia.
Zawsze kiedy w wyniku przetwarzania leksykalnego moliwe jest uzyskanie kilku wynikw, procesor leksykalny pobiera najduszy poprawny element leksykalny. Na przykad,
jeli kompilator napotyka nastpujc sekwencj znakw:
//

przetwarza je i interpretuje jako pocztek wiersza komentarza, a nie dwa wystpienia tokena / (w takim przypadku nie oznaczayby one pocztku komentarza). Podobnie dzieje si,
kiedy napotkana zostaje sekwencja:
!=

62

C# 2005. Warsztat programisty


Jest ona interpretowana jako operator porwnania. Majc to na uwadze, atwo zauway,
jak proste bdy typograficzne w kodzie rdowym mog doprowadzi do nieprawidowego dziaania programu. Zazwyczaj jednak powoduj one bd kompilacji.

Zakoczenia wierszy
Zakoczenie wiersza suy do dzielenia sekwencji znakw w pliku rdowym C# na osobne wiersze.
Istnieje szereg rnych zakocze wierszy:
Q

Znak powrotu karetki: U+000D

Przesunicie o wiersz: U+000A

Powrt karetki, a po nim przesunicie o wiersz: U+000D U+000A

Przejcie do nastpnego wiersza: U+2085

Separator wiersza: U+2028

Separator akapitu: U+2029

Aby zachowa wysoki poziom kompatybilnoci z rnymi narzdziami do edycji kodu rdowego, ktre umieszczaj znaki zakoczenia pliku, i zapewni, e pliki rdowe C# bd
odczytywane jako sekwencja poprawnie zakoczonych wierszy, s one poddawane dwm
przeksztaceniom:
Q

Jeli ostatnim znakiem w rdowym pliku C# jest Ctrl+Z (U+001A), to znak


ten zostaje usunity.

Jeli rdowy plik C# nie jest pusty i jeli jego ostatnim znakiem nie jest znak
powrotu karetki (U+000D), wysunicia wiersza (U+000A), przejcia do nastpnego
wiersza (U+2085), separatora wiersza (U+2028) lub separatora akapitu (U+2029),
to na kocu pliku umieszczony zostaje znak powrotu karetki (U+000D).

Komentarze
C# obsuguje dwa rodzaje komentarzy w plikach rdowych:
Q

Komentarze wyodrbnione

Komentarze jednowierszowe

W poniszych podpunktach omwimy te rodzaje komentarzy bardziej szczegowo.

Komentarze wyodrbnione
Komentarz wyodrbniony zawsze rozpoczyna si znakami /*, a koczy znakami */.
Komentarz taki moe zajmowa fragment wiersza:

Rozdzia 4. Q Struktura jzyka C#

63

/* Program testowy Hello World


*/ class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

Jeden wiersz:
/* Program testowy Hello World */
class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

Lub kilka wierszy:


/*
Program testowy Hello World
*/
class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

Komentarze wyodrbnione mog by umieszczane w dowolnych punktach kodu, o ile tylko


zajmuj wydzielony wiersz. Na przykad komentarz przedstawiony poniej jest wpisany
poprawnie:
/*
Program testowy Hello World
*/
class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

W tym przypadku take:


class Test
{
/*
Program testowy Hello World
*/
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

64

C# 2005. Warsztat programisty


Podobnie jak w tym:
/*
Program testowy Hello World
*/
class Test
{
static void Main() {
/*
acuch znakowy wywietlany na ekranie
*/
System.Console.WriteLine("Hello, World!");
}
}

To za przykad komentarza zapisanego niepoprawnie:


class Test
{
static void Main() {
System.Console. /*
Program testowy Hello World
*/
WriteLine("Hello, World!");
}
}

Komentarze jednowierszowe
Komentarze jednowierszowe to jak sama nazwa wskazuje, komentarze zawarte w jednym
wierszu. Zaczynaj si od znakw // i biegn do koca wiersza:
class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!"); // wywietla "Hello, World!"
}
}

Wewntrz kodu mona umieci tyle komentarzy jednowierszowych, ile jest konieczne:
// wywietla "Hello, World!"
class Test
{
static void Main(){
System.Console.WriteLine("Hello, World!"); // wywietla "Hello, World!"
}
}

Nie wolno jednak umieszcza komentarzy jednowierszowych wewntrz wyrae. Oto przykad niepoprawnego wpisania komentarza:
// wywietla "Hello, World!"
class Test
{

Rozdzia 4. Q Struktura jzyka C#

65

static void Main(){


System.Console.WriteLine // wywietla "Hello, World!" ("Hello, World!");
}
}

Ten kod take jest zapisany niewaciwie:


class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

Zagniedanie komentarzy
Nie mona zagnieda komentarzy. Trzeba tego unika w imi czytelnoci kodu:
// /* Niewaciwe zagniedenie komentarza */
/* // Niewaciwe zagniedenie komentarza */

Zagniedenie komentarzy nie powoduje bdu kompilacji; to jedynie niepoprawna


forma, utrudniajca czytanie kodu.

Biae znaki
Biaymi znakami s spacje, znaki tabulacji poziomej i pionowej, jak rwnie znak przesunicia strony.

Tokeny
Wyrniamy pi rodzajw tokenw:
Q

Identyfikatory

Sowa kluczowe

Literay

Operatory

Znaki interpunkcyjne

Biae znaki i komentarze nie s traktowane jak tokeny, a jedynie jako ich separatory.

Sekwencje specjalne Unicode


Sekwencje specjalne Unicode reprezentuj znaki Unicode. Jedna taka sekwencja reprezentuje pojedynczy znak Unicode.
Sekwencje tworzone s przy uyciu znakw \U lub \u, po ktrych nastpuje numer w formacie heksadecymalnym: \Uxxxx lub \uxxxx.

66

C# 2005. Warsztat programisty


Sekwencja \U0066 reprezentuje liter f. Jednake \U00660066 odpowiada f0066, a nie ff.
Aby uzyska dwuznak ff, naleaoby uy nastpujcej sekwencji:
\U0066\U0066

Przedstawiony niej kod stanowi przykad wykorzystania sekwencji specjalnych Unicode


w praktyce:
class Test
{
static void Main() {
System.Console.WriteLine("\u0048\u0065\u006C\u006C\u006f, World!");
}
}

Powyszy kod jest rwnowany poniszemu:


class Test
{
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}

Sekwencje specjalne przetwarzane s, gdy kompilator odnajduje je w:


Q

Identyfikatorach

Zwykych literaach acuchowych

Literaach znakowych

Sekwencje specjalne Unicode odnalezione w innych punktach kodu nie s przetwarzane.

Identyfikatory
Reguy rzdzce uyciem identyfikatorw s dokadnie takie same jak zalecane w Unicode
Standard Annex 15 (http://www.unicode.org/reports/tr15/), z nastpujcymi wyjtkami:
Q

Dopuszczalne jest uycie znaku podkrelenia jako znaku pocztkowego,


zgodnie z tradycj programowania w jzyku C.

Dopuszcza si uycie sekwencji specjalnych Unicode jako identyfikatorw.

Dopuszczalne jest uycie znaku @ jako prefiksu umoliwiajcego wykorzystanie


sw kluczowych jako identyfikatorw. Bywa to szczeglnie przydatne, gdy
programuje si interfejsy C# do innych jzykw programowania. Gdy prefiks @
zostaje uyty jako prefiks identyfikatora, wwczas identyfikator ten nazywany
jest identyfikatorem dosownym. I cho uycie prefiksu @ z identyfikatorami
niebdcymi sowami kluczowymi jest dopuszczalne, to jednak ze wzgldw
stylistycznych nie jest zalecane.

Oto przykady skadni identyfikatorw:


identyfikator:
dostpny-identyfikator
@ identyfikator-lub-sowo-kluczowe

Rozdzia 4. Q Struktura jzyka C#

67

dostpny-identyfikator:
identyfikator-lub-sowo-kluczowe, ktre nie jest sowem kluczowym
identyfikator-lub-sowo-kluczowe:
znak-pocztkowy-identyfikatora kolejne-znaki-identyfikatoraopcji
znak-pocztkowy-identyfikatora:
znak-litera
_ (znak podkrelenia U+005F)
kolejne-znaki-identyfikatora:
kolejny-znak-identyfikatora
kolejne-znaki-identyfikatora

kolejny-znak-identyfikatora

kolejny-znak-identyfikatora:
znak-litera
znak-cyfra-dziesitna
znak-cznik
znak-czcy
znak-formatujcy
znak-litera:
znak Unicode klasy Lu, Ll, Lt, Lm, Lo lub Nl
sekwencja-specjalna-Unicode reprezentujca znak klasy Lu, Ll, Lt, Lm, Lo lub Nl
znak-czcy:
znak Unicode klasy Mn lub Mc
sekwencja-specjalna-Unicode reprezentujca znak klasy Mn lub Mc
znak-cyfra-dziesitna:
znak Unicode klasy Nd
sekwencja-specjalna-Unicode reprezentujca znak klasy Nd
znak-cznik:
znak Unicode klasy Pc
sekwencja-specjalna-Unicode reprezentujca znak klasy Pc
znak-formatujcy:
znak Unicode klasy Cf
sekwencja-specjalna-Unicode reprezentujca znak klasy Cf

Przykadami poprawnych identyfikatorw mog by:


Q

identyfikatorl

_identyfikator

@private

Dwa identyfikatory uznawane s za identyczne, jeli po wymienionych niej przeksztaceniach (dokonanych w opisanej kolejnoci) staj si takie same:
Q

Usuwanie prefiksu @ z identyfikatorw dosownych.

Przeksztacenie kadej sekwencji specjalnej Unicode na znaki Unicode.

Usuwanie wszelkich znakw formatujcych..

68

C# 2005. Warsztat programisty


Identyfikatory, w ktrych wykorzystuje si dwa ssiadujce znaki podkrelenia (_),
s zastrzeone do wykorzystania w przyszoci.

Sowa kluczowe
Sowo kluczowe podobne jest do identyfikatora, z t rnic, e jest zastrzeone. Sowa kluczowe mog by identyfikatorami tylko wwczas, kiedy poprzedza je prefiks @.
Oto lista sw kluczowych w C#:
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
event
explicit
extern
false
finally
fixed
float
for
foreach
goto
if
implicit
in
int
interface
internal
is
lock
long

namespace
new
null
object
operator
out
override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short
sizeof
stackalloc
static
string
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
virtual
void
volatile
while

Rozdzia 4. Q Struktura jzyka C#

Literay
Zadanie literaw jest bardzo proste: reprezentuj one wartoci w kodzie rdowym.
Istnieje szereg rnych literaw.

Literay logiczne
W tej grupie wyrniamy dwa literay:
Q

true

false

Typem literaw logicznych jest bool.

Literay cakowitoliczbowe
Literay cakowitoliczbowe stosuje si do zapisywania wartoci nastpujcych typw:
Q

int

uint

long

ulong

Mog one przyjmowa jedn z dwch form:


Q

Wartoci dziesitne

Wartoci szesnastkowe

Typ literau cakowitoliczbowego mona okreli w nastpujcy sposb:


Q

Jeli litera cakowitoliczbowy zapisany jest bez sufiksu, to jest to litera typu:
int
uint
long
ulong

Jeli litera cakowitoliczbowy zapisany jest z sufiksem U lub u, to jest to litera typu:
uint
ulong

Jeli litera cakowitoliczbowy zapisany jest z sufiksem L lub l, to jest to litera typu:
long
ulong

Jeeli litera cakowitoliczbowy zapisany jest z sufiksem UL, uL, Ul, LU, lU lub Lu,
to jest to litera typu:
ulong

69

70

C# 2005. Warsztat programisty


Jeeli warto dowolnego literau cakowitoliczbowego wykracza poza zakres
wartoci dla typu ulong, wwczas kompilator generuje bd.

Literay rzeczywiste
Literay rzeczywiste su do zapisywania wartoci nastpujcych typw:
Q

float

double

decimal

Te trzy typy zapisywane s z trzema rnymi sufiksami:


Q

F lub f dla typu float

D lub d dla typu double

M lub m dla typu decimal

Jeli sufiks nie zosta uyty, warto domylnie przyjmuje typ double.

Literay znakowe
Litera znakowy reprezentuje pojedyncze znaki pomidzy apostrofami, jak 'x'.
Ponisza tabela wymienia specjalne sekwencje znakw w C#:
Sekwencja znakw

Nazwa znaku

Unicode

\'

Apostrof

0x0027

\"

Cudzysw

0x0022

\\

Ukonik lewy (backslash)

0x005C

\a

Alarm

0x0007

\b

Znak cofania

0x0008

\f

Wysuw strony

0x000C

\n

Nowy wiersz

0x000A

\0

Null

0x0000

\r

Powrt karetki

0x000D

\t

Tabulacja pozioma

0x0009

\v

Tabulacja pionowa

0x000B

Tak wyglda skadnia literaw znakowych:


znak-litera:
' znak '
znak:
pojedynczy-znak

Rozdzia 4. Q Struktura jzyka C#

71

prosta-sekwencja-specjalna
heksadecymalna-sekwencja-specjalna
sekwencja-specjalna-Unicode
pojedynczy-znak:
Dowolny znak oprcz ' (U+0027), \ (U+005C) oraz znaku nowego wiersza
prosta-sekwencja-specjalna: jedna z
\' \" \\ \0 \a \b \f \n \r \t \v
szesnastkowa-sekwencja-specjalna:
\x cyfra-hex cyfra-hexopcj cyfra-hexopcj

cyfra-hexopcj

Znak nastpujcy po lewym ukoniku (\) musi by jednym ze znakw wymienionych w powyszej tabeli, w przeciwnym razie podczas kompilacji pojawi si bd.

Literay acuchowe
W jzyku C# zaimplementowano obsug dwch rodzajw literaw acuchowych:
Q

Zwykych literaw acuchowych

Dosownych literaw acuchowych

Zwyky litera acuchowy jest acuchem skadajcym si z zera lub wicej znakw zapisanych pomidzy cudzysowami. Literay tego rodzaju mog zawiera zarwno proste, jak
i szesnastkowe sekwencje specjalne, jak rwnie sekwencje Unicode.
string = "Hello, World!";

Dosowny litera acuchowy skada si ze znaku @ poprzedzajcego cudzysw, a nastpnie zero lub wicej znakw, i koczy si cudzysowem.
string = @"Hello, World!";

Rnica pomidzy zwykym a dosownym literaem acuchowym polega na tym, e znaki


pomidzy cudzysowami zapisane w literale dosownym interpretowane s dosownie, a litera ten moe rozciga si na wiele wierszy kodu rdowego.
Naley przy tym zwrci uwag, e w przypadku przetwarzania literaw dosownych
jedynym wyjtkiem jest dwuznak \", reprezentujcy cudzysw.
string = @"Hello
,
World!";

Literay puste
Na temat literaw pustych nie da si powiedzie zbyt wiele po prostu s one puste.

Operatory i znaki przestankowe


W C# stosuje si wiele operatorw i znakw przestankowych.

72

C# 2005. Warsztat programisty


Q

Operatory stosuje si w wyraeniach w celu opisania operacji wykonywanych


na jednym, dwch lub wikszej liczbie operandw.

Znaki przestankowe su do grupowania i separowania.


Q

&

>

<

??

::

++

--

&&

||

Rozdzia 4. Q Struktura jzyka C#


Q

->

==

!=

<=

>=

+=

-=

*=

/=

%=

&=

|=

^=

<<

<<=

> > (przesunicie w prawo, zoone z dwch tokenw: > oraz >)

> >= (przypisanie przesunicia w prawo, skadajce si z dwch tokenw,


> oraz >=)

73

Dyrektywy preprocesora
Dyrektywy preprocesora zapewniaj kodowi C# ogromn funkcjonalno. Dziki nim mona:
Q

Warunkowo pomija fragmenty plikw rdowych.

Raportowa bdy.

Raportowa warunki ostrzegawcze.

Wyznacza sekcje kodu.

Sowo preprocesor pochodzi z jzykw C i C++ i poniewa przetwarzanie


wstpne w C# nie jest wykonywane, stosowane jest jedynie dla zachowania
spjnoci z tymi jzykami.
W C# dostpne s nastpujce dyrektywy preprocesora:
Q

#define oraz #undef. Su do definiowania i uniewaniania warunkowych

symboli kompilacyjnych.
Q

#if, #elif, #else oraz #endif. Su do pomijania sekcji kodu.

#line. Pozwala kontrolowa numery wierszy, w ktrych pojawiy si bdy


bd ostrzeenia.

74

C# 2005. Warsztat programisty


Q

#error oraz #warning. Su do wywietlania komunikatw o bdach i ostrzee.

#region oraz #endregion. Su do oznaczania sekcji kodu.

#pragma. Przekazuje kompilatorowi informacje kontekstowe.

Dyrektywy preprocesora nie s tokenami C# i nie stanowi elementu gramatyki syntaktycznej tego jzyka.
Kada dyrektywa preprocesora musi by wpisana w nowym wierszu kodu rdowego. Oprcz
tego kada z nich musi zaczyna si od znaku #, po ktrym nastpuje nazwa dyrektywy.
Warto pamita, e jakkolwiek przed znakiem #, a take pomidzy nim i nazw
dyrektywy, moe znajdowa si biay znak, to jednak nie jest to zalecane, gdy
utrudnia czytanie kodu.
Wiersz kodu zawierajcy dyrektyw #define, #undef, #if, #elif, #else, #endif lub #line
moe koczy si jednowierszowym komentarzem. W wierszach takich nie dopuszcza si
jednak umieszczania komentarzy wyodrbnionych.
Dyrektywy preprocesora mog mie ogromny wpyw na wyniki kompilacji rdowego
kodu C#.
Na przykad skompilowanie nastpujcego kodu:
#define A
#undef B
#define C
#undef B
class D
{
#if A
void E() {}
#else
void F() {}
#endif
#if B
void G() {}
#else
void H() {}
#endif
#if C
void I() {}
#else
void J() {}

Rozdzia 4. Q Struktura jzyka C#

75

#endif
#if D
void K() {}
#else
void L() {}
#endif
}

jest rwnowane zapisaniu kodu:


class D
{
void
void
void
void
}

E()
H()
I()
L()

{}
{}
{}
{}

Symbole kompilacji warunkowej


Funkcja kompilacji warunkowej wykorzystuje dyrektywy: #if, #elif, #else oraz #endif,
a steruje si nimi przy uyciu wyrae preprocesora i symboli kompilacji warunkowej.
Symbol kompilacji warunkowej moe przyj jeden z dwch stanw:
Q

Zdefiniowany

Niezdefiniowany

Pocztkowo symbol przyjmuje stan niezdefiniowany i zachowuje go do czasu jawnego zdefiniowania. Napotkana dyrektywa #define pozostaje w tym stanie do czasu napotkania dyrektywy #undef lub do chwili osignicia koca pliku rdowego.

Wyraenia preprocesora
Wyraenia preprocesora mog by zawarte w dyrektywach #if oraz #elif. W wyraeniach
tych mona stosowa nastpujce operatory:
Q

==

!=

&&

||

Do grupowania operatorw mona uy nawiasw.


Wynikiem wyraenia preprocesora zawsze jest warto logiczna.

76

C# 2005. Warsztat programisty

Dyrektywy deklaracji
Dyrektywy deklaracji su do definiowania i uniewaniania symboli kompilacji warunkowej.
Przetworzenie dyrektywy #define skutkuje zdefiniowaniem symbolu kompilacji warunkowej, obowizujcego od wiersza nastpujcego bezporednio po dyrektywie.
Przetworzenie dyrektywy #undef powoduje uniewanienie symbolu kompilacji warunkowej, obowizujce od wiersza nastpujcego bezporednio po dyrektywie.
Dyrektywa #define moe by te uyta do przedefiniowania symbolu, ktry zosta zdefiniowany wczeniej, bez koniecznoci uprzedniego stosowania dyrektywy #undef do tego symbolu.

Dyrektywy kompilacji warunkowej


Dyrektywy kompilacji warunkowej pozwalaj na warunkowe uwzgldnianie bd pomijanie fragmentw plikw rdowych C#.
Gdy uyte s dyrektywy kompilacji warunkowej, wwczas przetwarzana jest tylko jedna
sekcja.
Zasady przetwarzania s nastpujce:
Q

Dyrektywy #if oraz #elif s przetwarzane w kolejnoci, a do uzyskania


wartoci true. Jeli wynikiem wyraenia jest true, wwczas dana sekcja
kodu jest zaznaczana.

Jeli wszystkie dyrektywy zwracaj warto false, wwczas uyta zostaje


dyrektywa #else, o ile jest obecna w kodzie.

Jeeli wszystkie dyrektywy zwracaj warto false i nie mona odnale


dyrektywy #else, wwczas adna sekcja kodu nie zostaje zaznaczona.

Pominity kod nie jest uwzgldniany podczas analizy leksykalnej.

Dyrektywy diagnostyczne
Zadaniem dyrektyw diagnostycznych jest generowanie komunikatw o bdach i ostrzeeniach,
ktre raportowane s w taki sam sposb jak inne bdy i ostrzeenia w czasie kompilacji.
Zarwno:
#warning Sprawd kod!

jak i:
#error Bd kodu w tym miejscu

wygeneruj bd kompilacji i su jako wskaniki fragmentw wymagajcych wprowadzenia zmian.

Rozdzia 4. Q Struktura jzyka C#

77

Dyrektywy oznaczania fragmentw kodu


Dyrektywy te su do oznaczania fragmentw kodu rdowego. Fragmentom tym nie jest
przypisywane adne znaczenie semantyczne. Oznaczenia fragmentw wykorzystywane s
wycznie przez programistw lub zautomatyzowane narzdzia.
Dyrektywy oznaczania fragmentw kodu zapisuje si w sposb nastpujcy:
#region

#endregion

Zapis powyszy jest rwnowany zapisowi:


#if true

#endif

Dyrektywy #line
Dyrektywy #line su do zmiany numerw wierszy i nazw plikw rdowych zwracanych
przez kompilator, na przykad w komunikatach o bdach i w ostrzeeniach.
Jeli w kodzie rdowym nie ma adnej dyrektywy #line, wwczas kompilator zwraca rzeczywiste numery wierszy i nazwy plikw rdowych.

Dyrektywy #pragma
Dyrektywa #pragma jest dyrektyw preprocesora, przy uyciu ktrej dostarcza si kompilatorowi informacji kontekstowych.
Oto przykady sytuacji, w ktrych dyrektywy te bywaj uyteczne:
Q

Wczanie i wyczanie specyficznych ostrzee.

Wskazywanie informacji, ktre zostan wykorzystane przez debuger.

Podsumowanie
W rozdziale tym omawialimy leksykaln struktur C#, zwracajc szczegln uwag na
programy C#, gramatyk, zakoczenia wierszy, komentarze, tokeny, sowa kluczowe i dyrektywy. Majc na wzgldzie reguy gramatyki leksykalnej C#, programista moe oszczdzi sobie wiele pracy i przez zmniejszenie liczby bdw skrci czas debugowania.
W rozdziale 5. omwione zostan rozmaite koncepcje jzyka C#.

You might also like