C# a .NET 2.0 PROFESIONÁLNĚ Andrew Troelsen
Pro C# 2005 and the .NET 2.0 Platform Andrew Troelsen Original English language edition published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 by Apress L.P. Czech language edition copyright © 2006 by ZONER software, s.r.o. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Apress L.P. Originální anglické vydání vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 Apress L.P. České vydání vydal ZONER software, s.r.o., copyright © 2006. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení Apress L.P.
C# a .NET 2.0 PROFESIONÁLNĚ Autor: Andrew Troelsen Copyright © ZONER software, s.r.o. Vydání první v roce 2006. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR522 ZONER software, s.r.o. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera © Cover foto: Jiří Heller, HELLER.CZ s.r.o, www.heller.cz © Cover: PYRAMIDE, s.r.o. Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, s.r.o. Nové sady 18, 602 00 Brno tel.: 532 190 883, fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz
ISBN: 80-86815-42-0
Tuto knihu věnuji své matce, Mary Troelsen. Díky mamimko za to, jak si mně po dlouhá léta podporovala, i za roky, které teprve přijdou.
5
Obsah Informace o autorovi
31
Informace o odborném korektorovi
31
Poděkování
31
Úvod
32
Stručný přehled témat knihy
33
Sdělte nám svůj názor
40
Zdrojové soubory
40
Část I – Představení C# a platformy .NET
41
Kapitola 1
43
Filozofie .NET
Dřívější stav věcí
43
Jak se žije programátorům API C/Win32
44
Jak se žije programátorům C++/MFC
44
Jak se žije programátorům Visual Basicu 6.0
44
Jak se žije programátorům Java/J2EE
45
Jak se žije programátorům COM
45
Jak se žije programátorům DNA Windows
46
Řešení .NET
47
Úvod do stavebních bloků platformy .NET (CLR, CTS a CLS)
48
Role knihoven základních tříd
48
Co do této tabulky přináší C#
49
Další programovací jazyky vnímající .NET
50
Život ve vícejazyčném světě
51
Přehled assembly .NET
52
Assembly z jednoho souboru a vícesouborové assembly
53
Účel společného intermediárního jazyka
54
Výhody plynoucí z CIL
56
Kompilace CIL do instrukcí specifických pro platformu
57
Účel metadat typů .NET
57
Účel manifestu assembly
58
Společný systém typů
59
Typ třída CTS
59
Typ struktura CTS
60
Typ rozhraní CTS
60
Typ výčet CTS
61
Typ delegát CTS
61
Členy typů CTS
62
6 Interně zabudované datové typy CTS
62
Společná specifikace jazyků
63
Zajištění souladu s CLS
65
Společný runtime jazyků
65
Rozlišení pojmů – assembly, jmenný prostor a typ
66
Programátorský přístup k jmennému prostoru
69
Odkazy na externí assembly
71
Použití ildasm.exe
72
Prohlížení kódu CIL
73
Prohlížení metadat typů
73
Prohlížení metadat assembly
74
Rozmisťování runtime .NET
74
Nezávislost .NET na platformě
75
Shrnutí
77
Kapitola 2
Budování aplikací C#
79
Instalace .NET Frameworku 2.0 SDK
79
Kompilátor C# pro režim příkazového řádku (csc.exe)
80
Konfigurace kompilátoru csc.exe
81
Konfigurace dalších nástrojů .NET pro režim příkazového řádku
82
Budování aplikací C# pomocí csc.exe
82
Odkazy na externí assembly
84
Kompilace několika zdrojových souborů pomocí csc.exe
85
Odkazy na více externích assembly
86
Příkazové soubory pro csc.exe Výchozí příkazový soubor (csc.rsp) Debugger pro režim příkazového řádku (cordbg.exe) Ladění na příkazovém řádku Budování aplikací .NET pomocí TextPadu
86 87 88 88 89
Zobrazování klíčových slov C# jinou barvou
90
Konfigurace filtru pro soubory *.cs
91
Zavěšení TextPadu na csc.exe
91
Sdružování spouštěcích příkazů s prvky nabídky
92
Zapnutí vkládání fragmentů kódu C#
93
Budování aplikací .NET pomocí SharpDevelop
94
Co nabízí SharpDevelop
95
Prohlížeč projektu a prohlížeč tříd
96
Prohlížeč assembly (Assembly Scout)
97
Designéři formulářů Windows
98
Budování aplikací .NET pomocí Visual C# 2005 Express
99
7 Budování aplikací .NET s Visual Studiem 2005
100
Co nabízí Visual Studio 2005
101
Průzkumník řešení (Solution Explorer)
101
Prohlížeč tříd (Class View)
103
Okno definice kódu
103
Prohlížeč objektů (Object Browser)
104
Integrovaná podpora pro refaktoraci kódu
105
Expanze kódu a technologie obklopování kódu
107
Vizuální designér tříd (Visual Class Designer)
107
Nástroj pro testování objektů
110
Integrovaný systém nápovědy
111
Částečný katalog dalších vývojářských nástrojů .NET
112
Shrnutí
113
Část II – Programovací jazyk C# Kapitola 3
Základy jazyka C#
Anatomie jednoduchého programu C#
115 117 117
Variace na metodu Main()
118
Zpracování argumentů příkazového řádku
119
Specifikace argumentů příkazového řádku s Visual Studiem 2005
120
Zajímavá odbočka: třída System.Environment
121
Definování tříd a vytváření objektů
122
Účel konstruktorů
123
Vznikají tu snad díry v paměti (memory leaks)?
125
Definice "objektu aplikace"
125
Třída System.Console
127
Základní vstupní a výstupní operace s třídou Console
127
Formátování výstupu na konzoli
128
Znaky pro formátovací řetězce .NET
129
Zřízení viditelnosti členů Zřízení viditelnosti typů
131 132
Výchozí hodnoty třídy členských proměnných
133
Výchozí hodnoty a lokální proměnné
134
Syntaxe inicializace členských proměnných
134
Definice konstantních dat
136
Odkazy na konstantní data Definice datových členů určených pouze ke čtení Statické členské proměnné určené pouze ke čtení Klíčové slovo static
136 137 139 139
8 Statické metody
140
Statická data
141
Statické konstruktory
143
Statické třídy Modifikátory parametrů metod
145 146
Výchozí chování předávaných parametrů
147
Modifikátor out
147
Modifikátor ref
149
Modifikátor params
149
Iterační konstrukce
150
Cyklus for
151
Cyklus foreach
151
Cykly while a do/while
152
Rozhodovací konstrukce a porovnávací operátory Příkaz if/else Příkaz switch Hodnotové a referenční typy
153 153 154 155
Hodnotové typy, referenční typy a přiřazovací operátor
157
Hodnotové typy obsahující referenční typy
159
Předávání referenčních typů hodnotou
161
Předávání referenčních typů odkazem
162
Hodnotové a referenční typy: závěrečné srovnání
163
Operace boxing a unboxing Několik praktických ukázek operací boxing a unboxing Operace unboxing u vlastních hodnotových typů Práce s výčty .NET Základní třída System.Enum Třída, co trůní úplně nahoře: System.Object Výchozí chování System.Object
164 165 167 168 171 173 175
Překrývání výchozího chování System.Object
176
Překrývání System.Object.ToString()
176
Překrývání System.Object.Equals()
177
Překrývání System.Object.GetHashCode()
179
Testování překrytých členů
179
Statické členy System.Object
180
Datové typy jmenného prostoru System(a zkrácená notace C#)
181
Experimenty s číselnými datovými typy
184
Členy System.Boolean
184
Členy System.Char
185
Rozklad hodnot z řetězce dat
186
System.DateTime a System.TimeSpan
186
9 Datový typ System.String
187
Základní operace s řetězci
188
Řídicí znaky
189
Práce s doslovnými řetězci C#
190
Role System.Text.StringBuilder
191
Pole v .NET 192 Pole jako parametry (a návratové hodnoty)
194
Práce s vícerozměrnými poli
194
Základní třída System.Array
196
Typy C#, které mohou obsahovat null Jak se pracuje s typy, které mohou obsahovat null Operátor ??
197 198 199
Definice vlastních jmenných prostorů
200
Plně kvalifikovaný název typu
201
Definice s použitím aliasu
203
Vytváření vnořených jmenných prostorů
204
"Výchozí jmenný prostor" Visual Studia 2005
205
Shrnutí
Kapitola 4
206
Objektově orientované programování s C#
Třída v C# Přetěžování metod
207 207 209
Odkaz na sebe v C# pomocí this
211
Definice veřejného rozhraní třídy
213
Pilíře OOP
214
Zapouzdření
214
Dědění
215
Polymorfismus
216
První pilíř: služby C# pro zapouzdření
217
Vynucení zapouzdření pomocí tradičních metod accessor a mutator
219
Jiná forma zapouzdření: vlastnosti třídy
219
Interní reprezentace vlastností C#
223
Jak se řídí viditelnost příkazů get/set vlastnosti
224
Vlastnosti určené pouze pro čtení nebo pouze pro zápis
225
Statické vlastnosti
225
Druhý pilíř: podpora C# pro dědění
226
Řízení vytváření tříd pomocí klíčového slova base
228
Několik slov k základním třídám
230
Udržení rodinných tajemství – klíčové slovo protected
230
Jak se zamezí dědění: zapečetěné třídy
231
10 Programování modelu zadržování/delegování Definice vnořených typů Třetí pilíř: podpora polymorfismu v C# Klíčová slova virtual a override
232 234 236 237
Opětovná návštěva klíčového slova sealed
238
Co jsou abstraktní třídy
239
Vynucování polymorfických činností: abstraktní metody
240
Skrývání členů Pravidla C# pro přetypování
244 246
Jak se určí "typ" zaměstnance
248
Přetypování čísel
249
Parciální typy C#
249
Dokumentace zdrojového kódu C# přes XML
251
Formátovací znaky souboru XML s komentáři kódu Transformace souboru XML s komentáři kódu Shrnutí
Kapitola 5
253 254 254
Doba života objektu
255
Třídy, objekty a odkazy
255
Základy doby života objektu
256
CIL klíčového slova new
257
Účel kořenů aplikace
259
Generace objektu
260
Typ System.GC
261
Jak se vynutí svoz odpadků
262
Budování finalizovatelných objektů
265
Překrývání System.Object.Finalize() Podrobnosti k procesu finalizace Budování likvidovatelných objektů
266 268 268
Opětovné využití klíčového slova using C#
270
Budování finalizovatelných a likvidovatelných typů
272
Formalizovaný vzor likvidace Shrnutí
Kapitola 6
273 274
Strukturované zpracování výjimek
Óda na chyby, závady a výjimky Účel zpracování výjimek .NET Atomy zpracování výjimek .NET Základní třída System.Exception Nejjednodušší možný příklad
275 275 276 277 278 279
11 Generování obecné výjimky Zachytávání výjimek Konfigurace stavu výjimky
281 283 284
Vlastnost TargetSite
284
Vlastnost StackTrace
285
Vlastnost HelpLink
286
Vlastnost Data
287
Výjimky na úrovni systému (System. SystemException)
289
Výjimky na úrovni aplikace (System. ApplicationException)
289
Budování vlastních výjimek, první pokus
290
Budování vlastních výjimek, druhý pokus
291
Budování vlastních výjimek, třetí pokus
292
Zpracování vícenásobných výjimek
293
Všeobecné příkazy catch
295
Opakované generování výjimek
296
Vnitřní výjimky
296
Blok Finally
298
Kdo generuje co?
298
Výsledek nezpracované výjimky
300
Ladění nezpracovaných výjimek ve Visual Studiu 2005
300
Shrnutí
301
Kapitola 7
Rozhraní a kolekce
303
Definice rozhraní v C#
303
Implementace rozhraní v C#
304
Rozdíl mezi rozhraním a abstraktní základní třídou
306
Volání členů rozhraní na úrovni objektů
307
Získávání odkazů na rozhraní: klíčové slovo as Získávání odkazů na rozhraní: klíčové slovo is
308 308
Rozhraní jako parametry
309
Rozhraní jako návratové hodnoty
311
Pole typů rozhraní
312
Explicitní implementace rozhraní
313
Řešení konfliktů v názvech Budování hierarchií rozhraní Rozhraní s více základními rozhraními
315 316 317
Implementace rozhraní pomocí Visual Studia 2005
318
Budování typů, jimiž lze procházetv cyklu (IEnumerable a IEnumerator)
320
Co jsou iterátory C# Budování objektů, které lze klonovat (ICloneable)
322 324
12 Propracovanější ukázka klonování
326
Budování objektů, kterélze porovnávat (IComparable)
329
Specifikace více možných řazení (IComparer)
332
Vlastní vlastnosti, vlastní typy řazení Rozhraní jmenného prostoru System.Collections Účel rozhraní ICollection
333 334 335
Účel rozhraní IDictionary
336
Účel rozhraní IDictionaryEnumerator
336
Účel rozhraní IList
337
Typy tříd v System.Collections
337
Jak se pracuje s typem ArrayList
338
Jak se pracuje s typem Queue (fronta)
339
Jak se pracuje s typem Stack (zásobník)
340
Jmenný prostor System.Collections.Specialized
341
Shrnutí
342
Kapitola 8
Rozhraní pro zpětná volání, delegáti a události
343
Rozhraní pro zpětná volání
343
Delegáti .NET
347
Definice delegáta v C#
348
Základní třídy System.MulticastDelegate a System.Delegate
351
Nejjednodušší možný příklad delegáta
352
Prozkoumání objektu delegáta Vylepšení typu Car pomocí delegátů Zapnutí vícenásobného volání
354 356 358
Propracovanější ukázka delegátů
361
Delegáti jako parametry
362
Analýza kódu pracujícího s delegáty
365
Co v kontextu delegátů znamená kovariance
365
Události C#
368
Události – pohled pod kapotu
369
Naslouchání přicházejícím událostem
371
Zjednodušení registrace událostí ve Visual Studiu 2005
372
"Vyštafírovaná" událost Anonymní metody C# Přístup k "vnějším" proměnným Konverze ovladačů událostí na podkladové delegáty Shrnutí
373 375 376 377 379
13 Kapitola 9
Pokročilé techniky C# pro sestrojování typů
Vybudování vlastního indexeru
381 381
Variace na indexer garáže
383
Interní reprezentace typu indexerů
384
Indexery: pár drobností nakonec
385
Přetěžování operátorů
386
Přetěžování binárních operátorů
387
Operátory += a -=
389
Přetěžování unárních operátorů
389
Přetěžování operátorů pro rovnost
390
Přetěžování porovnávacích operátorů
391
Interní reprezentace přetížených operátorů
392
Komunikace s přetíženými operátory z jazyků, pro které je přetěžování operátorů výzvou
393
Závěrečné úvahy o přetěžování operátorů
395
Konverze vlastních typů
395
Opakování: číselné konverze
396
Opakování: konverze mezi typy tříd, které pocházejí z jedné hierarchie
396
Vytváření vlastních konverzních rutin Jiné explicitní konverze pro typ Square Definice implicitních konverzních rutin
397 399 400
Interní reprezentace vlastních konverzních rutin
401
Klíčová slova C# pro pokročilé
402
Klíčové slovo checked
402
Klíčové slovo unchecked
405
Práce s ukazateli
406
Klíčové slovo sizeof
413
Preprocesorové direktivy C#
414
Specifikace regionů kódu
414
Podmíněná kompilace kódu
415
Shrnutí
Kapitola 10
417
Generika
419
Operace boxing a unboxing a jejich vztah k System.Object
419
Stinné stránky operací boxing a unboxing
421
Typová bezpečnost a silně typované kolekce Stinné stránky operace boxing a silně typovaných kolekcí Jmenný prostor System.Collections.Generic Průzkum typu List<T> Vytváření generických metod Vynechání typových parametrů
422 424 426 427 430 431
14 Vytváření generických struktur (nebo tříd) Klíčové slovo default v generickém kódu Vytvoření vlastní generické kolekce
433 434 436
Omezování parametrů typu pomocí where
437
Nepodporovaná omezení vztahující se k operátorům
440
Vytváření generických základních tříd
441
Vytváření generických rozhraní
442
Vytváření generických delegátů Simulace generických delegátů pod .NET 1.1 Několik slov k vnořeným delegátům Shrnutí
446 446
Část III – Programování s assembly .NET Kapitola 11
443 445
Úvod do assembly .NET
Účel assembly .NET
447 449 449
Assembly prosazují opětovné využívání kódu
449
Assembly zřizují hranice typů
450
Assembly jsou jednotky opatřené verzí
450
Assembly plně popisují samy sebe
451
Assembly se dají konfigurovat
451
Formát assembly .NET
451
Záhlaví Win32
452
Záhlaví CLR
452
Kód CIL, metadata typů a manifest assembly
454
Nepovinné prostředky assembly
454
Assembly tvořené jediným souborem a několika soubory
455
Jak se buduje a konzumuje jednosouborová assembly
457
Průzkum manifestu
460
Průzkum CIL
461
Průzkum metadat
462
Vybudování klientské aplikace C#
463
Vybudování klientské aplikace ve Visual Basicu .NET
465
Ukázka dědění přes jazyky
466
Vybudování a zkonzumování vícesouborové assembly
467
Průzkum souboru ufo.netmodule
468
Průzkum airvehicles.dll
468
Konzumace vícesouborové assembly
469
Privátní assembly Identita privátní assembly
470 471
15 Proces sondování
471
Konfigurace privátních assembly
472
Konfigurační soubory a Visual Studio 2005
474
Konfigurační utilita .NET Frameworku 2.0
474
Sdílené assembly
476
Silné názvy assembly
477
Silný název pro CarLibrary.dll
479
Přiřazování silných názvů pomocí Visual Studia 2005
480
Instalace sdílených assembly do GAC a jejich odstraňování
481
Účel odloženého podepsání Konzumace sdílené assembly Průzkum manifestu SharedCarLibClient Konfigurace sdílených assembly Zmrazení aktuální sdílené assembly
481 483 485 485 486
Vybudování sdílené assembly verze 2.0.0.0
486
Dynamické přesměrovánína konkrétní verzi sdílené assembly
488
Další návštěva utility .NET Framework 2.0 Configuration
489
Průzkum interní skladby GAC
490
Assembly politiky vydavatele
492
Vypnutí politiky vydavatele
493
Prvek <codeBase>
493
Jmenný prostor System.Configuration
495
Konfigurační soubor stroje
497
Vázání assembly – celkový pohled
497
Shrnutí
498
Kapitola 12
Reflexe typu, pozdní vázání a programování založené na atributech
Nezbytnost metadat typů
499 499
Prohlídka (části) metadat výčtu EngineState
500
Prohlídka (části) metadat typu Car
501
Průzkum prvku TypeRef
502
Dokumentace samotné assembly
503
Dokumentace odkazovaných assembly
503
Dokumentace řetězcových literálů
504
Reflexe
504
Třída System.Type
505
Získání odkazu na typ pomocí System.Object.GetType()
506
Získání odkazu na typ pomocí System.Type.GetType()
507
Získání odkazu na typ pomocí typeof()
507
16 Vybudování vlastního prohlížeče metadat
508
Reflexe metod
508
Reflexe členských proměnných a vlastností
508
Reflexe implementovaných rozhraní
509
Zobrazení pár drobností nakonec
509
Implementace metody Main()
510
Reflexe parametrů metod a návratových hodnot
511
Dynamicky načítané assembly
513
Reflexe sdílených assembly
515
Pozdní vázání
517
Třída System.Activator
517
Volání metod bez parametrů
518
Volání metod s parametry Programování s atributy
519 520
Konzumenti atributů
521
Používání předdefinovaných atributů v C#
521
Specifikace parametrů pro konstruktory atributů
523
Atribut Obsolete v akci
524
Zkrácená notace atributů v C#
524
Budování vlastních atributů
525
Používání vlastního atributu
525
Restrikce na používání atributů
526
Atributy na úrovni assembly (a modulu)
528
Soubor AssemblyInfo.cs Visual Studia 2005
528
Reflexe atributů pomocí brzkého vázání
529
Reflexe atributů pomocí pozdního vázání
530
Využití reflexe, pozdního vázání a vlastních atributů
532
Budování rozšiřitelné aplikace
532
Vybudování CommonSnappableTypes.dll
533
Vybudování zapojitelného modulu C#
534
Vybudování zapojitelného modulu Visual Basicu .NET
535
Vybudování rozšiřitelné formulářové aplikace Windows
535
Shrnutí
Kapitola 13
538
Procesy, aplikační domény, kontexty a hostitelé CLR
Rekapitulace tradičních procesů Win32 Stručný souhrn informací o vláknech Komunikace s procesy pod platformou .NET
539 539 540 542
Seznam běžících procesů
544
Průzkum konkrétního procesu
545
17 Průzkum sady vláken procesu
545
Průzkum sady modulů procesu
547
Programátorské startování a zastavování procesů
549
Aplikační domény .NET
550
Seznam aplikačních domén procesu
552
Programátorské vytváření nových aplikačních domén
554
Programátorské odebírání aplikační domény Hranice kontextů
555 556
Kontextově agilní typy a typy vázané na kontext
557
Definice objektu vázaného na kontext
559
Kontrola kontextu objektu
559
Shrnutí procesů, aplikačních domén a kontextů
561
Hostování samotného CLR
561
Vykonávání CLR bok po boku
562
Načtení konkrétní verze CLR
563
Jiní hostitelé CLR Shrnutí
Kapitola 14
564 564
Budování vícevláknových aplikací
Vztah mezi procesem, aplikační doménou, kontextem a vláknem Problémy souběžného zpracování a účel synchronizace vláken
565 565 566
Stručná rekapitulace delegátů .NET
567
Asynchronní povaha delegátů
570
Metody BeginInvoke() a EndInvoke()
570
Rozhraní System.IAsyncResult
570
Volání metody v asynchronním stylu
571
Synchronizace volajícího vlákna
572
Účel delegáta AsyncCallback
573
Účel třídy AsyncResult
575
Předávání a příjem vlastních stavových dat
575
Jmenný prostor System.Threading Třída System.Threading.Thread
576 577
Získání statistik o aktuálním vláknu
578
Vlastnost Name
579
Vlastnost Priority
580
Programátorské vytváření sekundárních vláken
581
Jak se pracuje s delegátem ThreadStart
581
Jak se pracuje s delegátem ParameterizedThreadStart
584
Vlákna na popředí a na pozadí
585
Problém souběžného zpracování
586
18 Synchronizace pomocí klíčového slova lock C#
589
Synchronizace pomocí typu System.Threading.Monitor
590
Synchronizace pomocí typu System.Threading.Interlocked
591
Synchronizace pomocí atributu [Synchronization]
592
Programování s třídouTimer a delegátem TimerCallback
593
Fond vláken CLR
595
Shrnutí
596
Kapitola 15
CIL a účel dynamických assembly
597
Úvahy o povaze programování CIL
597
Průzkum direktiv, atributů a operačních kódů CIL
598
Účel direktiv CIL
599
Účel atributů CIL
599
Účel operačních kódů CIL
599
Odlišení operačních kódů CIL od mnemonického CIL
600
Zásobníkový charakter CIL
600
Technika cesty tam a zpět
602
Účel návěští kódu CIL
605
Interakce s CIL: modifikace souboru *.il
606
Kompilace kódu CIL pomocí ilasm.exe
607
Kompilace kódu CIL pomocí SharpDevelop
609
Kompilace kódu CIL pomocí ILIDE#
609
Účel peverify.exe Direktivy a atributy CIL
610 611
Specifikace externě odkazovaných assembly v CIL
611
Definice aktuální assembly v CIL
611
Definice jmenných prostorů v CIL
612
Definice typu třídy v CIL
613
Definice a implementace rozhraní v CIL
614
Definice struktur v CIL
615
Definice výčtů v CIL
615
Kompilace souboru CILTypes.il
616
Knihovna základních tříd .NET, C# a mapování datových typů CIL
616
Definice členů typu v CIL
617
Definice datových členských proměnných v CIL
617
Definice konstruktorů typu v CIL
618
Definice vlastností v CIL
619
Definice parametrů členu
620
Průzkum operačních kódů CIL
621
Direktiva .maxstack
623
19 Deklarace lokálních proměnných v CIL
623
Mapování parametrů na lokální proměnné v CIL
624
Skrytý odkaz this
625
Reprezentace iteračních konstrukcí v CIL
626
Vybudování assembly .NET s CIL
627
Vybudování CILCars.dll
627
Vybudování CILCarClient.exe Dynamické assembly Průzkum jmenného prostoru System.Reflection.Emit
630 632 633
Účel typu System.Reflection.Emit.ILGenerator
634
Emitování dynamické assembly
635
Emitování assembly a sady modulů
637
Účel typu ModuleBuilder
639
Emitování typu HelloClass a řetězcové členské proměnné
640
Emitování konstruktorů
640
Emitování metody SayHello()
641
Použití dynamicky vygenerované assembly
642
Několik vět o System.CodeDOM
643
Shrnutí
644
Část IV – Programování s knihovnami .NET Kapitola 16
Jmenný prostor System.IO
Průzkum jmenného prostoru System.IO Typy Directory(Info) a File(Info) Abstraktní základní třída FileSystemInfo Jak se pracuje s typem DirectoryInfo
645 647 647 648 649 650
Výčet FileAttributes
652
Výčet jednotlivých souborů pomocí typu DirectoryInfo
653
Vytváření podadresářů s typem DirectoryInfo
654
Jak se pracuje s typem Directory
655
Jak se pracuje s třídou DriveInfo
656
Jak se pracuje s třídou FileInfo
657
Metoda FileInfo.Create()
658
Metoda FileInfo.Open()
659
Metody FileInfo.OpenRead() a FileInfo.OpenWrite()
660
Metoda FileInfo.OpenText()
661
Metody FileInfo.CreateText() a FileInfo.AppendText() Jak se pracuje s typem File Nové členy typu File v .NET 2.0
661 661 662
20 Abstraktní třída Stream Jak se pracuje s objekty FileStream Čtenáři a zapisovatelé proudů (třídy StreamReader a StreamWriter)
664 665 667
Zápis do textového souboru
668
Čtení z textového souboru
669
Přímé vytváření typů StreamWriter a StreamReader
670
Jak se pracuje s typy StringWriter a StringReader
670
Jak se pracuje s binárními čtenáři a zapisovatelidat (třídy BinaryWriter a BinaryReader)
672
Programátorské "špehování" souborů
674
Asynchronní vstupní a výstupní operace se soubory
677
Shrnutí
678
Kapitola 17
Serializace objektů
Serializace objektu Účel objektových grafů Konfigurace objektů pro serializaci Veřejné a privátní datové členské proměnné, veřejné vlastnosti Výběr formátovače pro serializaci
679 679 681 682 683 683
Rozhraní IFormatter a IRemotingFormatting
684
Loajalita k typu mezi formátovači
685
Serializace objektů s BinaryFormatter
686
Deserializace objektů pomocí BinaryFormatter Serializace objektů pomocí SoapFormatter
687 688
Serializace objektů pomocí XmlSerializer
689
Řízení vygenerovaných dat XML
690
Uchovávání kolekce objektů
692
Přizpůsobení serializačního procesu
694
Důkladnější pohled na serializaci objektu
695
Přizpůsobení procesu serializace pomocí rozhraní ISerializable
696
Přizpůsobení procesu serializace pomocí atributů
698
Přidělování verze serializovatelným objektům
699
Shrnutí
702
Kapitola 18
Vrstva .NET remoting
703
Definice .NET remotingu
703
Jmenné prostory .NET remotingu
704
Pracovní rámec .NET remotingu Proxy a zprávy
705 706
Kanály
707
Opětovná návštěva u formátovačů .NET
708
21 Dáme to teď všechno do kupy!
709
Několik slov k rozšiřování standardních rozvodů
709
Termíny v .NET remotingu
710
Volby pro dirigování objektů: MBR nebo MBV?
710
Aktivační volby pro typy dirigované odkazem: WKO nebo CAO?
712
Stavová konfigurace dobřeznámých typů: unikát nebo jediné volání?
713
Souhrn charakteristických rysů objektových typů dirigovaných odkazem
714
Základy rozmisťování projektu .NET remoting
715
Vybudování první distribuované aplikace
716
Vybudování všeobecné assembly
716
Vybudování serverové assembly
717
Vybudování assembly SimpleRemoteObjectClient.exe
718
Otestování aplikace remotingu
719
Co představuje typ ChannelServices
720
Co představuje typ RemotingConfiguration
721
Aktivační režim typů dobře známých objektů
723
Rozmístění serverové aplikace na vzdálený stroj
724
Přidání kanálu TCP do výbavy
725
Několik slov k IpcChannel
726
Vzdálené konfigurační soubory
726
Budování souborů *.config na straně serveru
727
Budování souborů *.config u klienta
728
Práce s objekty dirigovanými hodnotou
729
Vybudování všeobecné assembly
730
Vybudování serverové assembly
731
Vybudování klientské assembly
732
Objekty aktivované klientem
734
Pronájem času objektů CAO a unikátních WKO
737
Výchozí chování pronájmu času
737
Změna výchozích charakteristik pronájmu času
740
Úpravy pronájmu času na straně serveru
741
Úpravy pronájmu času u klienta
741
Sponzorství pronájmu časuna straně serveru (a u klienta)
742
Alternativní hostitelé vzdálených objektů
743
Hostování vzdálených objektů pomocí služby Windows Hostování vzdálených objektů pomocí IIS Asynchronní remoting Účel atributu [OneWay] Shrnutí
744 748 750 751 752
22 Kapitola 19
Lepší okna se System.Windows.Forms
Přehled jmenného prostoru System.Windows.Forms
753 753
Jak se pracuje s typy formulářů Windows
755
Ruční vybudování hlavního okna
755
Důsledná separace záležitostí
757
Účel třídy Application Zábava s třídou Application Delegát System.EventHandler
758 759 760
Anatomie formuláře
761
Funkcionalita třídy Control
762
Zábava s třídou Control
765
Reakce na událost MouseMove
766
Jak se určí, kterým tlačítkem myši se kliklo
767
Reakce na události klávesnice
768
Funkcionalita třídy Form Životní cyklus typu Form Budování aplikací Windows s Visual Studiem 2005
769 770 773
Zapnutí zastaralých ovládacích prvků
775
Pitva projektu formulářů Windows Visual Studia 2005
776
Zpracování událostí v době návrhu
777
Třída Program
778
Automaticky odkazované assembly
778
Jak se pracuje s MenuStrip a ContextMenuStrip
778
Přidání TextBox do MenuStrip
781
Vytvoření kontextové nabídky
783
Zaškrtávání prvků nabídky Jak se pracuje s ovládacími prvky StatusStrip Návrh systému nabídek
785 787 788
Návrh stavového proužku
789
Jak se pracuje s časovačem (typ Timer)
792
Přepínání zobrazení
793
Zobrazení nápovědy pro prvky nabídek
794
Zřízení stavu "Připraven" Jak se pracuje s ovládacími prvky ToolStrip Práce s kontejnery objektu ToolStrip Budování aplikace s vícedokumentovým rozhraním Vybudování rodičovského formuláře
795 795 800 802 802
Vybudování dceřiného formuláře
803
Vytvoření dceřiných oken
804
Shrnutí
805
23 Kapitola 20
Realizace grafických dat s GDI+
807
Nástin jmenných prostorů GDI+
807
Přehled jmenného prostoru System.Drawing
808
Utilitní typy System.Drawing
809
Typy Point a PointF
810
Typy Rectangle a RectangleF
811
Třída Region
812
Co představuje třída Graphics
812
Relace Paint
814
Zrušení platnosti klientské oblasti formuláře
815
Získání objektu Graphics mimo ovladač události Paint
816
Stručně o likvidaci objektu Graphics Souřadnicový systém GDI+
818 819
Výchozí měrná jednotka
820
Specifikace jiné měrné jednotky
821
Specifikace jiného počátku v systému souřadnic Definování barev
822 824
Třída ColorDialog
825
Manipulace s písmem
826
Jak se pracuje s rodinami písem
827
Jak se pracuje s řezy a velikostmi písma
829
Výpis nainstalovaných písem
831
Třída FontDialog Nástin jmenného prostoru System.Drawing.Drawing2D Kreslení pomocí pera Jak se pracuje s konci čar Kreslení pomocí štětce
833 835 836 838 840
Jak se kreslí se šrafovanými štětci
841
Jak se kreslí štětcem s texturou
843
Jak se kreslí lineárním gradientním štětcem
844
Kreslení obrázků
846
Přetahování a testování kliknutí v ovládacím prvku PictureBox
848
Testování kliknutí myší v nakreslených obrázcích Testování kliknutí v obrázcích, které nemají tvar obdélníka Formát prostředku .NET
851 854 857
Jmenný prostor System.Resources
858
Programátorské vytvoření souboru *.resx
858
Vybudování souboru *.resources
859
Svázání souboru *.resources s assembly .NET
860
Jak se pracuje se zapisovateli prostředků
860
24 Generování prostředků z Visual Studia 2005 Programátorské čtení prostředků Shrnutí
Kapitola 21
861 863 864
Programování s ovládacími prvky formulářů Windows 865
Svět ovládacích prvků formulářů Windows
865
Ruční přidávání ovládacích prvků do formuláře
866
Typ Control.ControlCollection
868
Přidávání prvků do formulářů ve Visual Studiu 2005
869
Základní ovládací prvky
870
Zábava s popisky
871
Zábava s textovými poli
872
Zábava s typem MaskedTextBox
875
Zábava s tlačítky
877
Zábava s ovládacími prvky CheckBox, RadioButton a GroupBox
879
Zábava se seznamem, který je vybaven zaškrtávacími políčky
883
Zábava se seznamem typu ListBox
885
Zábava se seznamem, který má textové pole Konfigurace tabulátorového pořadí prvků Průvodce tabulátorovým pořadím prvků
886 888 888
Nastavení výchozího tlačítka formuláře
889
Exotičtější ovládací prvky
889
Zábava s kalendářem
890
Zábava s vysvětlivkami
891
Zábava se záložkami
893
Zábava s posuvníkem typu TrackBar
894
Zábava s panely
897
Zábava s číselníky
898
Zábava s poskytovatelem informací o chybě
900
Zábava se stromovým zobrazením založeným na TreeView
903
Zábava s webovým prohlížečem
908
Budování vlastních ovládacích prvků formulářů Windows Vytvoření obrázků
909 911
Vybudování uživatelského rozhraní v době návrhu
911
Implementace jádra ovládacího prvku CarControl
912
Definice vlastní události
913
Definice vlastní vlastnosti
914
Řízení animace
916
Nakreslení přezdívky auta
916
Otestování typu CarControl
916
25 Vybudování hostitelského formuláře pro CarControl
917
Účel jmenného prostoru System.ComponentModel
919
Zdokonalení vzhledu CarControl v době návrhu
920
Definice výchozí vlastnosti a výchozí události
921
Přiřazení obrázku k vlastnímu ovládacímu prvku v Toolboxu Budování vlastních dialogových oken Vlastnost DialogResult Dědění formulářů Dynamicky určovaná pozice ovládacích prvků formulářů Windows
922 924 925 926 929
Vlastnost Anchor
929
Vlastnost Dock
930
Tabulkový a plovoucí layout Shrnutí
Kapitola 22
931 933
Přístup k databázím s ADO.NET
Vysokoúrovňová definice ADO.NET Dvě tváře ADO.NET Pojem poskytovatel dat ADO.NET
935 935 936 937
Poskytovatelé dat od Microsoftu
939
Vybraní poskytovatelé dat od jiných výrobců
940
Dodatečné jmenné prostory ADO.NET
940
Typy jmenného prostoru System.Data
941
Účel rozhraní IDbConnection
942
Účel rozhraní IDbTransaction
943
Účel rozhraní IDbCommand
943
Účel rozhraní IDbDataParameter a IDataParameter
944
Účel rozhraní IDbDataAdapter a IDataAdapter
944
Účel rozhraní IDataReader a IDataRecord
945
Abstrakce poskytovatelů dat pomocí rozhraní
946
Zvýšení flexibility pomocí konfiguračních souborů aplikace
948
Model továrny poskytovatele v .NET 2.0
949
Registrované továrny poskytovatelů dat
950
Kompletní příklad továrny poskytovatele dat
951
Prvek <connectionStrings>
954
Instalace databáze Cars
955
Jak se z Visual Studia 2005 připojit k databázi Cars Připojená vrstva ADO.NET
956 957
Jak se pracuje s objekty připojení
959
Jak se v .NET 2.0 pracuje s tvůrci připojovacích řetězců
961
Jak se pracuje s objekty příkazů
962
26 Jak se pracuje s čtenáři dat Získání více sad výsledků najednou pomocí čtenáře dat Modifikace dat tabulek pomocí objektu příkazů
963 965 966
Vkládání nových záznamů
968
Odstraňování existujících záznamů
969
Aktualizace existujících záznamů
970
Jak se pracuje s objekty parametrizovaných příkazů Specifikace parametrů pomocí typu DbParameter
970 971
Vykonání uložené procedury pomocí DbCommand
973
Asynchronní přístup k datům pod .NET 2.0
975
Odpojená vrstva ADO.NET
976
Účel sady dat
977
Členy typu DataSet Jak se pracuje s typy DataColumn
978 980
Vybudování datového sloupce
981
Zapnutí automatické inkrementace ve vybraných sloupcích
982
Přidání datového sloupce do datové tabulky
982
Jak se pracuje s datovými řádky Co znamená vlastnost DataRow.RowState Jak se pracuje s datovými tabulkami Jak se v NET 2.0 pracuje se čtenáři datových tabulek Uchovávání sady dat (a datových tabulek) jako XML Vázání datových tabulek na uživatelská rozhraní Odstraňování řádků programátorsky
983 984 985 987 988 990 992
Filtry a řazení
993
Aktualizace řádků
995
Jak se pracuje s typem DataView
997
Jak se pracuje s datovými adaptéry
998
Naplnění sady dat pomocí datového adaptéru Mapování databázových názvů na přívětivé názvy Aktualizace databáze pomocí objektů datových adaptérů
999 1000 1001
Nastavení vlastnosti InsertCommand
1002
Nastavení vlastnosti UpdateCommand
1003
Nastavení vlastnosti DeleteCommand
1003
Automatické generování příkazů SQL pomocí tvůrců
1004
Sady dat s více tabulkami a objekty datových relací
1006
Navigace po tabulkách propojených relacemi
1009
Průvodci zaměření na práci s daty
1011
Silně typované sady dat
1013
Automaticky vygenerovaná datová komponenta
1014
Shrnutí
1014
27
Část V – Webové aplikace a webové služby XML Kapitola 23
Webové stránky ASP.NET 2.0 a webové ovládací prvky
1015 1017
Účel HTTP
1017
Co jsou webové aplikace a webové servery
1018
Jak se pracuje s virtuálními adresáři IIS
1019
Vývojářský server ASP.NET 2.0
1021
Účel HTML
1021
Struktura dokumentu HTML
1022
Vývoj formuláře HTML
1023
Budování uživatelského rozhraní založeného na HTML
1024
Účel skriptů u klienta
1025
Ukázka skriptu u klienta
1027
Ověřování platnosti dat formuláře v default.htm
1027
Odeslání dat formuláře (GET a POST)
1028
Vybudování klasické stránky ASP
1029
Odpověď pro data odeslaná metodou POST Problémy s klasickými ASP stránkami
1030 1031
Hlavní přednosti ASP.NET 1.x
1031
Hlavní zdokonalení a rozšíření, která přináší ASP.NET 2.0
1032
Jmenné prostory ASP.NET 2.0 Model kódu webové stránky ASP.NET
1033 1034
Fungování stránky založené na modelu jediného souboru
1034
Jak se pracuje s modelem kódu v pozadí
1041
Detaily adresářové struktury webu ASP.NET
1044
Účel složky Bin
1045
Účel složky App_Code
1047
Kompilační cyklus stránky ASP.NET 2.0
1048
Kompilační cyklus stránek tvořených jediným souborem
1048
Kompilační cyklus stránek se souborem kódu v pozadí
1049
Řetěz dědění typu Page Typ System.Web.UI.Page Interakce s příchozím HTTP požadavkem
1050 1051 1051
Získání statistik o prohlížeči
1053
Přístup k příchozím datům formuláře
1054
Vlastnost IsPostBack
1054
Interakce s odchozí odpovědí HTTP
1055
Zapisování obsahu HTML
1056
Přesměrování uživatelů
1057
28 Životní cyklus webové stránky ASP.NET
1057
Účel atributu AutoEventWireUp
1058
Událost Error
1060
Co je podstatou webových ovládacích prvků
1061
Zpracování události na straně serveru
1062
Vlastnost AutoPostBack
1063
Typ System.Web.UI.Control
1064
Výpis prvků obsažených ve stránce
1064
Dynamické přidávání (a odstraňování) ovládacích prvků
1066
Klíčové členy typu System.Web.UI.WebControls.WebControl
1068
Rozdělení webových ovládacích prvků ASP.NET
1069
Několik slov k System.Web.UI.HtmlControls Vybudování jednoduchého webu ASP.NET 2.0
1069 1070
Jak se pracuje se vzory stránek
1070
Definice obsahové stránky Default.aspx
1074
Návrh obsahové stránky skladu
1075
Návrh stránky, kde si uživatel vybere své auto
1081
Účel validačních ovládacích prvků
1083
Prvek RequiredFieldValidator
1085
Prvek RegularExpressionValidator
1085
Prvek RangeValidator
1086
Prvek CompareValidator
1086
Vytváření validačních souhrnů Shrnutí
Kapitola 24
1087 1088
Webové aplikace ASP.NET 2.0
1089
Potíže se stavem
1089
Techniky pro správu stavu v ASP.NET
1091
Účel stavu zobrazení ASP.NET
1092
Jak se pracuje se stavem zobrazení
1092
Přidávání vlastních dat do stavu zobrazení
1094
Několik slov ke stavu ovládacího prvku
1095
Účel souboru Global.asax
1096
Prostředek poslední záchrany, globální ovladač nezpracovaných výjimek
1097
Základní třída HttpApplication
1098
Vztah mezi aplikací a relací
1098
Jak se udržují stavová data na úrovni aplikace
1099
Modifikace aplikačních dat
1102
Zpracování shození webové aplikace
1103
Jak se pracuje s aplikační cache
1103
29 Zábava s ukládáním dat do cache Modifikace souboru *.aspx Uchovávání dat relace Další členy HttpSessionState Co jsou cookies
1104 1106 1109 1112 1113
Vytváření cookies Čtení přicházejících dat cookie Konfigurace webové aplikace ASP.NET pomocí Web.config
1114 1115 1116
Zapnutí sledování prostřednictvím <trace>
1118
Přizpůsobení výstupu chyb přes <customErrors>
1119
Volby pro ukládání stavu přes <sessionState>
1120
Utilita ASP.NET 2.0 pro administraci webu
1122
Dědění konfigurace
1122
Shrnutí
1124
Kapitola 25
Webové služby XML
Účel webových služeb XML Přednosti webových služeb XML
1125 1125 1126
Definice klienta webové služby XML
1126
Základní stavební bloky webové služby XML
1127
Stručně o zjišťovacích službách
1127
Stručně o popisných službách
1128
Stručně o přenosovém protokolu
1129
Jmenné prostory .NET webové služby XML Průzkum jmenného prostoru System.Web.Services Ruční vybudování webové služby XML Otestování webové služby XML pomocí WebDev.WebServer.exe
1129 1130 1130 1131
Otestování webové služby pomocí IIS
1132
Prohlídka kontraktu WSDL
1132
Automaticky generovaná testovací stránka
1133
Vlastní testovací stránka
1133
Vybudování webové služby XML s Visual Studiem 2005
1134
Implementace webové metody TellFortune()
1135
Role základní třídy WebService
1137
Popis atributu [WebService]
1137
Efekt vlastností Namespace a Description Vlastnost Name Popis atributu [WebServiceBinding]
1138 1138 1139
Jak se dá ignorovat ověřování souladu s BP 1.1
1140
Jak se úplně vypne ověřování souladu s BP 1.1
1140
30 Popis atributu [WebMethod]
1141
Dokumentace webové metody přes vlastnost Description
1141
Předcházení konfliktů názvů ve WSDL pomocí vlastnosti MessageName
1141
Budování stavových webových služeb pomocí vlastnosti EnableSession
1142
Průzkum popisného jazyka webové služby (WSDL)
1144
Definice dokumentu WSDL
1145
Prvek <types>
1146
Prvek <message>
1147
Prvek <portType>
1148
Prvek <binding>
1149
Prvek <service>
1149
Opětovná návštěva u protokolů webové služby XML
1150
Vázání HTTP GET a HTTP POST
1150
Vázání SOAP
1152
Utilita wsdl.exe příkazového řádku
1153
Transformace WSDL do kostry webové služby XML na straně serveru
1154
Transformace WSDL do proxy u klienta
1155
Průzkum kódu proxy
1156
Výchozí konstruktor
1156
Podpora synchronního vyvolávání
1157
Podpora asynchronního vyvolávání
1158
Vybudování klientské aplikace
1158
Generování kódu proxy z Visual Studia 2005
1159
Vystavení vlastních typů z webových metod
1161
Vystavení pole
1161
Vystavení struktury
1162
Vystavení sady dat ADO.NET
1163
Klient formulářů Windows
1164
Reprezentace typu u klienta
1165
Zjišťovací protokol služby (UDDI)
1166
Komunikace s UDDI přes Visual Studio 2005
1167
Shrnutí
1168
Rejstřík
1169
31
Informace o autorovi ANDREW TROELSEN je Microsoft MVP (Visual C#) a zároveň partner, lektor a konzultant u Intertech Training (www.IntertechTraining.com), což je centrum pro vzdělávání vývojářů .NET a J2EE. Napsal mnoho knih, mezi něž patří Developer’s Workshop to COM and ATL 3.0 (Wordware Publishing, 2000), COM and .NET Interoperability (Apress, 2002), Visual Basic .NET and the .NET Platform: An Advanced Guide (Apress, 2001) a získal cenu za C# and the .NET Platform (Apress, 2003). Andrew dále napsal řadu článků o .NET pro MSDN a MacTech (kde prozkoumával ty aspekty platformy .NET, které jsou nezávislé na platformách). Často také vystupuje na všelijakých konferencích a v diskusních skupinách. Andrew v současné době žije se svou ženou Amandou v Minneapolis ve státě Minnesota. Svůj volný čas tráví čekáním na to, až Wild vyhrají Stanley Cup, až Vikingové vyhrají Super Bowl (bylo by pěkné, kdyby se jim to podařilo dřív, než půjde do důchodu), a až se Timberwolves stanou několikanásobnými vítězi NBA.
Informace o odborném korektorovi GAVIN SMYTH je profesí softwarový inženýr s tolika lety zkušeností z oblasti vývoje softwaru, že už je ani nepočítá. Participoval na široké paletě projektů: od ovladačů zařízení až k aplikacím hostovaným na více zařízeních; na mnoha odlišných platformách, jako jsou "holé železo", operační systémy pracující v reálném čase a systémy Unix a Windows; a v mnoha jazycích, mezi něž kromě mnoha jiných patří assembler, C++, Ada a C#. Pracoval pro takové klienty jsou BT a Nortel. V současné době je zaměstnán u společnosti Microsoft. Gavin také publikoval několik pěkných kousků odborné beletrie, nicméně zjistil, že kritizovat to, co udělali jiné lidé, ho uspokojuje mnohem víc. Když zrovna na své zahradě nebojuje s plevelem a s mravenci, pokouší se přemluvit roboty LEGO, aby dělali to, co od nich chce, aby dělali (a abychom byli upřímní – dělá to jen kvůli svým dětem).
Poděkování Dokončit třetí vydání této knihy by bylo zhola nemožné, kdyby se na něm nepodílelo mnoho talentovaných osobností. Především patří mé díky veškerému personálu u vydavatelství Apress. Jako vždy měli neskutečné starosti a práci s tím, aby z mého surového rukopisu vyrobili úhledný produkt. Musím poděkovat svému odbornému korektorovi, jímž byl Gavin Smyth (aka Eagle Eye), který si dal opravdu záležet na tom, aby byla kniha perfektní. Samozřejmě – veškeré zbývající chyby (překlepy, chyby v kódu, nebo jinde), které mohly v knize zůstat, padají plně a pouze na mou hlavu.
32 Děkuji svým přátelům a své rodině, kteří (zase ještě jednou) tolerovali, že jsem měl pro ně velmi málo času, a že jsem někdy byl úplně mimo. Další dík patří mým přátelům a spolupracovníkům u Intertech Training. Vaší podpory (jak přímé, tak i nepřímé) se nesmírně cením. Nakonec bych chtěl poděkovat své ženě Mandy a "všem dětem" za to, že mě mají rádi a že mě povzbuzují.
Úvod Ještě si vzpomínám, jak jsem před lety nabídl vydavatelství Apress knihu, která se měla zabývat nastupujícím vývojovým softwarovým kitem s kódovým názvem Next Generation Windows Services (NGWS). Jak možná víte, z NGWS se nakonec stalo to, čemu říkáme platforma .NET. Současně s tím, jak jsem pracoval na počáteční verzi svého rukopisu, jsem paralelně prozkoumával programovací jazyk C# i platformu .NET. Byl to fantastický projekt – musím však přiznat, že mi ničil nervy víc než dost, protože je opravdu na mrtvici psát o takové technologii, která v průběhu svého vývoje podstupuje skutečně zásadní změny. Nakonec to ale dobře dopadlo (po mnoha bezesných nocích) a první vydání knihy C# and the .NET Platform vyšlo souběžně s prvním vydáním .NET 1.0 Beta 2. Pokud si dobře vzpomínám, bylo to někdy v létě roku 2001. Byl jsem nesmírně šťastný a vděčný, když jsem viděl, že kniha má příznivé ohlasy od kritiků. Nejvíce mě ale potěšilo, když moji knihu příznivě přijala i samotná čtenářská obec. Časem byla nominovaná na cenu Jolt Award (nevyhrál jsem... ať jdou do háje!) a pak v roce 2003 na Referenceware Excellence Award v kategorii knih o programování (Já jsem vyhrál? Super!). Druhé vydání této knihy (C# and the .NET Platform, Second Edition) mi poskytlo příležitost rozvinout existující obsah s ohledem na verzi 1.1 platformy .NET. Přestože druhé vydání knihy nabízelo hodně nových témat, mnohé kapitoly a příklady nebylo možné do finálního produktu zařadit. Nyní, když kniha vstoupila do třetí etapy své existence, jsem rád, že mohu říci, že můj rukopis obsahuje (téměř) všechna témata i všechny příklady, které jsem nebyl schopen namačkat do předchozích verzí. Text tohoto vydání nejenže bere v úvahu všelijaká cingrlátka a parádičky přicházející s .NET 2.0, ale zařadil jsem do něho i řadu kapitol, které už mám napsané dlouho, a které jsem ještě nikdy nepublikoval (jako například obsah společného intermediárního jazyka, Common Intermediate Language, neboli CIL). Stejně jako v předchozích vydáních, i v třetím vydání předkládám programovací jazyk C# a knihovny základních tříd .NET v přívětivém a vstřícném tónu. Nikdy jsem vlastně nechápal potřebu některých odborných autorů vychrlit ze sebe takovou prózu, že vznikne něco jako studijní slovník pro přijímací zkoušky, a nikoliv srozumitelná kniha, která se dá skutečně číst. I toto nové vydání je zaměřeno tak, aby poskytlo potřebné informace k tomu, abyste mohli skutečně na úrovni budovat softwarová řešení dneška. V knize tak nebudete trávit mládí prozkoumáváním esoterických detailů, které ve skutečném světě nebudete vůbec potřebovat.
33
Vy a já jsme tým Autoři píší o technologiích na základě poptávky nějaké skupiny lidí (a musíte si uvědomit, že i já jsem jeden z nich). Určitě víte, že budování softwarových řešení pomocí libovolné platformy zahrnuje neobyčejně mnoho všelijakých podrobností a že velmi závisí na konkrétním oddělení, kde pracujete, na firmě, klientské základně i na předmětu, kterého se budování softwaru týká. Možná děláte v oblasti elektronického publikování, vyvíjíte systémy pro vládu nebo pro místní zastupitelstvo, nebo pracujete pro NASA nebo pro armádu. Pokud jde o mne, vyvinul jsem software pro vzdělávání dětí, různé n-vrstevné systémy, a také různé projekty z oblasti zdravotnictví a bankovnictví. Mohu téměř s jistotou tvrdit, že kód, který píšete na svém pracovišti, bude mít jen velmi málo společného s kódem, který píšu já (pokud jsme náhodou v minulosti nespolupracovali!). Proto jsem se v této knize úmyslně rozhodl, že nebudu vytvářet příklady, v nichž by byl jejich kód těsně svázaný s nějakým konkrétním odvětvím nebo programátorskou branží. Rozhodl jsem se proto, že vysvětlím C#, OOP, CLR a knihovny základních tříd .NET 2.0 pomocí příkladů, které jsou nedogmatické vzhledem k odvětvím. Místo toho, aby každý příklad plnil daty nějakou mřížku, vypočítával velikost splátky, nebo cokoliv jiného v tom duchu, rozhodl jsem se pro předmět, k němuž má nějaký vztah skutečně každý: auťáky. A abychom mohli dát vše do kupy, budeme potřebovat několik geometrických struktur nějakého zaměstnance. A zde vstupujete na scénu vy. Mým úkolem bude, abych vám co nejlépe vysvětlil programovací jazyk C# a klíčové aspekty platformy .NET. Podniknu také vše, co mohu, abych vás vybavil nástroji a strategiemi, které budete potřebovat, budete-li si chtít prohlubovat znalosti získané při studiu této knihy. Vaším úkolem bude strávit tyto informace a aplikovat je ve vašich konkrétních programovacích úlohách. Je mi úplně jasné, že vaše projekty se nebudou točit okolo vašich automobilových miláčků, ale o tom přesně aplikování znalostí je! Na závěr vás ujišťuji, že jakmile pochopíte pojmy prezentované v tomto textu, budete perfektně vybaveni tak, abyste mohli budovat řešení .NET, které bude ušité na míru vašemu jedinečnému programovacímu prostředí.
Stručný přehled témat knihy Třetí vydání této knihy je logicky rozčleněno do pěti samostatných částí. Každá z nich obsahuje několik kapitol, které k sobě "nějak patří". Jestliže jste četli předchozí vydání knihy, povšimnete si jistých podobnosti v názvech kapitol, nicméně si uvědomte, že téměř každá stránka byla aktualizovaná novým obsahem a rozšířenými příklady. Také si povšimněte, že z některých témat z prvního a druhého vydání knihy (jako jsou serializace objektů a svoz odpadků .NET, neboli garbage collector) se staly samostatné kapitoly. Jak samozřejmě očekáváte, třetí vydání knihy obsahuje několik zbrusu nových kapitol (včetně kapitoly zasvěcené syntaxi a sémantice CIL). Nechybí také podrobný výklad nových schopností přicházejících s verzí 2.0. Rozdělení probírané látky na jednotlivé části a kapitoly obsahuje následující stručný přehled.
34
Část I – Představení C# a platformy .NET Účelem první části knihy je, abyste se aklimatizovali na klíčové aspekty platformy .NET, na systém typů .NET, a také na rozličné vývojářské nástroje (z nichž mnohé jsou open-source), které se používají při sestrojování aplikací .NET. Přitom se průběžně seznámíte s některými základními prvky programovacího jazyka C#.
Kapitola 1 – Filozofie .NET První kapitola má posloužit jako páteř pro zbytek knihy. Začneme s průzkumem světa tradičního programování pod Windows a odhalíme některé nedokonalosti předchozího stavu věcí. Primárním cílem kapitoly ovšem je, abyste se dobře obeznámili s řadou centrálních stavebních bloků .NET, mezi něž patří společný runtime jazyků (Common Language Runtime, CLR), společný systém typů (Common Type System, CTS), společná specifikace jazyků (Common Language Specification, CLS) a knihovny základních tříd. Dále se poprvé podíváte na formát programovacího jazyka C# a assembly .NET. Pak prozkoumáte nezávislou povahu platformy .NET a nezapomeneme na roli společné infrastruktury jazyků (Common Language Infrastructure, CLI).
Kapitola 2 – Budování aplikací C# Cílem kapitoly je obeznámit vás s procesem kompilace a ladění souborů zdrojového kódu C# pomocí různých nástrojů a technik. Nejprve se naučíte pracovat s kompilátorem příkazového řádku (csc.exe) a se soubory odpovědí C#. Ve zbývající části kapitoly pak prozkoumáte řadu všelijakých integrovaných vývojových rozhraní, jako jsou TextPad, SharpDevelop, Visual C# 2005 Express a Visual Studio 2005. Zmíníme se také o řadě dalších open-source nástrojů (Vil, NAnt, NDoc atd.), které by měl mít schované v záloze každý vývojář .NET.
Část II – Programovací jazyk C# V této části se probírají až do morku kostí podrobnosti programovacího jazyka C#, včetně nových syntaktických konstrukcí přicházejících s .NET 2.0. V této části uvidíte vystavené všechny členy CTS (třídy, rozhraní, struktury, výčty a delegáty). Dozvíte se také, jak se sestrojují generické typy.
Kapitola 3 – Základy jazyka C# V této kapitole prozkoumáme klíčové konstrukce programovacího jazyka C#. Porozumíte základním technikám sestrojování tříd, rozdílům mezi hodnotovými a referenčními typy, pochopíte, co je boxing a unboxing, a zjistíte, jakou roli hraje oblíbenec každého z nás – základní třída System. Object. Kapitola 3 rovněž ilustruje, jak platforma .NET pracuje s různými všudypřítomnými programovacími konstrukcemi, jako jsou výčty, pole a zpracování řetězců. V kapitole nakonec probereme řadu témat specifických pro .NET 2.0, např. datové typy, které mohou obsahovat null.
35
Kapitola 4 – Objektově orientované programování s C# Účel kapitoly 4 spočívá v průzkumu detailů toho, jak se C# vypořádává s jednotlivými "pilíři" OOP: zapouzdření, dědění a polymorfismus. Jakmile se seznámíte s klíčovými slovy a syntaxí pro budování hierarchií tříd, zjistíte, jak se prostřednictvím XML dokumentuje kód.
Kapitola 5 – Doba života objektu V této kapitole prozkoumáme, jak CLR pomocí "svozu odpadků" (garbage collector) .NET spravuje paměť. Pochopíte účel kořenů aplikace, účel generování objektů, a účel typu System.GC. Jakmile zvládnete tyto základy, zbytek kapitoly vás provede procesem finalizace (přes metodu System.Object.Finalize()). Nechybí informace o objektech, které lze likvidovat (přes rozhraní IDisposable).
Kapitola 6 – Strukturované zpracování výjimek Těžištěm šesté kapitoly je diskuse o tom, jak pomocí strukturovaného zpracování výjimek zpracovávat anomálie, které se při běhu vyskytnou ve vašem kódu. Dozvíte se podrobnosti o klíčových slovech C# (try, catch, throw a finally), které vám umožní zpracovat vzniklé závady, a pochopíte, jaký je rozdíl mezi výjimkami na úrovni aplikace a na úrovni systému. V kapitole dále prozkoumáme nástroje Visual Studia 2005, které vám umožní ladit takové výjimky, které unikly vaší pozornosti.
Kapitola 7 – Rozhraní a kolekce Látka v této kapitole vám má pomoci, aby se vám dostalo do krve programování založené na objektech. V sedmé kapitole tedy probereme programování založené na rozhraních. Dozvíte se, jak se definují typy, které podporují více chování, jak se tato chování odhalují při běhu, a jak se dají tato chování selektivně skrývat pomocí explicitní implementace rozhraní. Abychom předvedli a potvrdili prospěšnost typů, které fungují jako rozhraní, prozkoumáme ve zbytku kapitoly jmenný prostor System.Collections.
Kapitola 8 – Rozhraní pro zpětná volání, delegáti a události Účelem kapitoly 8 je demystifikovat pojem delegáta. Lapidárně řešeno – delegát .NET je nějaký objekt, který "ukazuje" na jiné metody ve vaší aplikaci. Budete-li se držet tohoto vzoru, budete moci budovat systémy, které budou umožňovat, aby se v obousměrné konverzaci angažovalo více objektů. Poté, co prozkoumáte, jak se používají delegáti .NET (včetně četných schopností přicházejících s verzí 2.0, jako jsou anonymní metody), seznámíte se s klíčovým slovem event C#, které zjednodušuje manipulace při programování se surovými delegáty.
Kapitola 9 – Pokročilé techniky C# pro sestrojování typů V této kapitole prohloubíte své vědomosti o programovacím jazyku C#, protože se seznámíte s řadou vyspělých programovacích technik. Dozvíte se například, jak se překrývají operátory, jak se
36 vytvářejí vlastní konverzní rutiny (implicitní i expicitní), a jak se budují indexery typů. Také se dozvíte, jak se uvnitř souboru *.cs manipuluje s ukazateli ve stylu C.
Kapitola 10 – Generika Od verze .NET 2.0 byl programovací jazyk C# rozšířen tak, že podporuje novou schopnost CTS, které se říká generika. Jak sami uvidíte, generické programování značně zvyšuje výkon aplikace i bezpečnost typů. V této kapitole nejenom probádáme různé generické typy nacházející se ve jmenném prostoru System.Collections.Generic, ale také se dozvíte, jak se budují vlastní generické metody a typy (s omezeními i bez nich).
Část III – Programování s assembly .NET Ve třetí části knihy se ponoříme do podrobností assembly .NET. Dozvíte se nejenom, jak se rozmisťují a konfigurují knihovny kódu .NET, ale začnete také chápat interní kompozici binární podoby .NET. V této části se vysvětluje nejenom účel atributů .NET, ale také sestrojování vícevláknových aplikací. V závěrečných kapitolách této třetí části knihy se prozkoumávají některé nízkoúrovňové detaily (jako je kontext objektu), syntaxe, a sémantika CIL.
Kapitola 11 – Úvod do assembly .NET Na velmi vysoké úrovni je assembly termín, jímž se myslí nějaký řízený (managed) soubor *.dll nebo *.exe. Assembly .NET však vyjadřují něco mnohem bohatěji vybaveného. Zde se dozvíte, jaký je rozdíl mezi assembly, která je tvořena jediným souborem a assembly, která se skládá z několika souborů. Dozvíte se také, jak se vybuduje a rozmístí každá z obou entit. Dále prozkoumáte, jak se dají pomocí souborů *.config založených na XML a assembly politiky vydavatele nakonfigurovat privátní a sdílené assembly. Nakonec prozkoumáte interní strukturu globální cache assembly (Global Assembly Cache, GAC) a účel konfigurační utility .NET Frameworku 2.0.
Kapitola 12 – Reflexe typu, pozdní vázání a programování založené na atributech V kapitole 12 budeme pokračovat v prozkoumávání assembly .NET. Podíváme se na proces odhalování typů při běhu, což se dělá přes typy obsažené ve jmenném prostoru System.Reflection. Pomocí těchto typů můžete budovat takové aplikace, které dokáží číst metadata assembly za pochodu. Dozvíte se, jak se pomocí pozdního vázání dynamicky aktivují typy za běhu (a jak se s nimi manipuluje). Závěrečným tématem této kapitoly bude průzkum účelu atributů .NET. Abychom prakticky předvedli užitečnost probraných témat, zakončíme tuto kapitolu vytvořením rozšiřitelné formulářové aplikace Windows.
Kapitola 13 – Procesy, aplikační domény, kontexty a hostitelé CLR Když už máte solidní vědomosti ohledně assembly, v této kapitole se o něco hlouběji ponoříte do kompozice načteného spustitelného souboru .NET. Prvním naším cílem bude ilustrovat, jaký je
37 vztah mezi procesy, aplikačními doménami a hranicemi kontextů. Až tyto termíny řádně vysvětlíme, budete rozumět tomu, jak operační systém Windows hostuje samotný CLR. Budete také lépe chápat, k čemu slouží mscoree.dll. Informace předložené v této kapitole vám poslouží jako perfektní náběh do kapitoly 14.
Kapitola 14 – Budování vícevláknových aplikací V této kapitole prozkoumáte, jak se budují vícevláknové aplikace. Popisuje se zde řada technik, které se dají použít, chcete-li vytvářet kód, který bude bezpečný vzhledem k vláknům. Kapitolu zahájíme tím, že opět navštívíme delegáty .NET, abychom lépe pochopili interně zabudovanou podporu delegátů pro asynchronní vyvolávání metod. Pak budeme prozkoumávat typy nacházející se uvnitř jmenného prostoru System.Threading. Společně se podíváme na mnoho typů (Thread, ThreadStart atd.), které umožňují snadno vytvářet dodatečná vykonávací vlákna.
Kapitola 15 – CIL a účel dynamických assembly Tato kapitola má dva cíle. V první polovině prozkoumáme syntaxi a sémantiku CIL do mnohem větších detailů než v předchozích kapitolách. Ve zbytku kapitoly probereme roli jmenného prostoru System.Reflection.Emit. S využitím jeho typů budete schopni budovat takový software, který bude umět při běhu generovat assembly .NET v paměti. Formálně řečeno – assembly, které se definují a vykonávají v paměti, se nazývají jako dynamické assembly.
Část IV – Programování s knihovnami .NET V tomto místě knihy už byste měli mít zvládnuté solidní základy jazyka C# i podrobnosti formátu assembly .NET. V této čtvrté části (kde si osvojíte úplně nové pole znalostí) začnete prozkoumáním několika jmenných prostorů z knihoven základních tříd. Pak se budeme věnovat vstupním a výstupním operacím se soubory, vývoji formulářů Windows či vrstvě .NET remoting. Nakonec si popíšeme přístup k databázím pomocí ADO.NET.
Kapitola 16 – Jmenný prostor System.IO Jak se dá uhádnout z jeho názvu, jmenný prostor System.IO umožňuje interakce se strukturou souborů a adresářů nějakého stroje. V průběhu této kapitoly se např. dozvíte, jak se programátorsky vytvoří (a odstraní) systém adresářů. Dozvíte se také, jak se přesouvají data do různých proudů a z nich ven (jedná o proudy založené na souborech, řetězcích, paměti atd.).
Kapitola 17 – Serializace objektů V této sedmnácté kapitole prozkoumáte služby platformy .NET pro serializaci objektů. Pokud to řekneme jednoduše, serializace umožňuje zachovat stav objektu (nebo sady objektů, které mají mezi sebou nějaký vztah) do nějakého proudu pro potřeby pozdějšího využití. Deserializace (jak asi očekáváte) je proces, při kterém se objekt vytvoří z proudu v paměti pro potřeby aplikace. Poté,
38 co zvládnete nezbytné základy, se dozvíte, jak se dá proces serializace přizpůsobit prostřednictvím rozhraní ISerializable a pomocí sady nových atributů přicházejících s .NET 2.0.
Kapitola 18 – Vrstva .NET remoting Navzdory všeobecně rozšířenému názoru nejsou webové služby XML jediným způsobem, jak se dají pod platformou .NET budovat distribuované aplikace. Zde se dozvíte více informací o vrstvě .NET remoting. Uvidíte, že CLR podporuje jistou schopnost, s jejíž pomocí se dají snadno předávat objekty přes hranice aplikací a strojů. Sématicky se jedná o dirigování hodnotou (Marshal-By-Balue, MBV ) a dirigování odkazem (Marshal-By-Reference, MBR). V průběhu prací se také dozvíte, jak se dá deklarativně měnit chování při běhu distribuované aplikace .NET pomocí konfiguračních souborů XML.
Kapitola 19 – Lepší okna se System.Windows.Forms V této kapitole začnete s průzkumem jmenného prostoru System.Windows.Forms. Zde se dozvíte podrobnosti o tom, jak se budují tradiční desktopové aplikace s grafickým uživatelským rozhraním (GUI), které podporuje menu, panely nástrojů a stavové řádky. A jak doufáte, v této kapitole probereme nejenom různé aspekty Visual Studia 2005 pro práci v době designu, ale také typy formulářů Windows v .NET 2.0 (MenuStrip, ToolStrip atd.).
Kapitola 20 – Realizace grafických dat s GDI+ V této kapitole se probírá, jak se v prostředí formulářů Windows dynamicky realizují grafická data. Kromě toho, že si popíšeme, jak se manipuluje s písmy, barvami, geometrickými obrázky a se soubory obrázků, prozkoumáme také, jak se zachytávají kliknutí kurzorem myši v dané oblasti (tzv. hit testing). Nezapomeneme také na techniky přetahování kurzorem myši, které jsou založeny na GUI. Nakonec se budeme věnovat novému formátu pro prostředky .NET, který je založen na reprezentaci dat XML.
Kapitola 21 – Programování s ovládacími prvky formulárů Windows V poslední z kapitol, které se soustřeďují na aplikace Windows, prozkoumáme různé prvky grafického uživatelského rozhraní, které se dodávají s .NET Frameworkem 2.0. Dozvíte se nejenom, jak pracovat s všelijakými ovládacími prvky formulářů Windows, dozvíte se také více informací o vyvíjení dialogových oken a dědění formulářů. Kromě toho v této kapitole také prozkoumáme, jak se budují vlastní ovládací prvky formulářů Windows, které se integrují do IDE.
Kapitola 22 – Přístup k databázím s ADO.NET ADO.NET je API platformy .NET pro přístup k datům. Jak uvidíte, budete s to komunikovat s typy ADO.NET pomocí připojené i odpojené vrstvy. V průběhu kapitoly dostanete šanci pracovat s oběma režimy ADO.NET a dozvíte se o několika nových tématech ADO.NET v .NET 2.0 (model továrny poskytovatele dat, tvůrci připojovacích řetězců a synchronní databázový přístup).
39
Část V – Webové aplikace a webové služby XML Pátá část je zasvěcena tvorbě webových aplikací ASP.NET a webovým službám XML. Jak uvidíte v prvních dvou kapitolách této části, ASP.NET 2.0 je hodně velkou modernizací ASP.NET 1.x a zahrnuje různé nové parádičky.
Kapitola 23 – Webové stránky ASP.NET 2.0 a webové ovládací prvky Touto kapitolou začíná vaše studium webových technologií, které se na platformě .NET podporují pomocí ASP.NET. Jak uvidíte, skriptovací kód na straně serveru se nyní nahrazuje "opravdovými" objektově orientovanými jazyky (jako jsou C#, VB.NET atd.). Kapitola vás uvede do klíčových témat ASP.NET, mezi něž patří práce se soubory kódu v pozadí (nebo bez nich), role webových ovládacích prvků ASP.NET, ovládací prvky pro ověřování platnosti dat nebo také komunikace s novým modelem vzoru stránek (master page), který poskytuje ASP.NET 2.0.
Kapitola 24 – Webové aplikace ASP.NET 2.0 V této předposlední kapitole rozšíříte své aktuální vědomosti o ASP.NET tím, že prozkoumáte všelijaké způsoby, jimiž lze pod .NET zpracovávat správu stavu. Podobně jako je tomu u klasického ASP, i ASP.NET umožňuje snadno vytvářet cookies nebo proměnné na úrovni aplikace (nebo relace). ASP.NET však také zavádí novou techniku správy stavu: cache aplikace. Až se podíváte na několik způsobů pro správu stavu s ASP.NET, dozvíte se, jakou roli hraje základní třída System. HttpApplication (číhá uvnitř souboru Global.asax) a jak můžete pomocí souboru Web.config dynamicky měnit chování vaší webové aplikace při běhu.
Kapitola 25 – Webové služby XML V poslední kapitole této knihy prozkoumáte roli webových služeb XML v .NET. Řečeno prostě, webová služba je nějaká assembly, která se aktivuje pomocí standardních požadavků HTTP. Elegance tohoto přístupu spočívá v tom, že HTTP je jediným protokolem, který je univerzálně přijímán prakticky téměř všude, a proto je vynikající volbou pro budování distribuovaných systémů, které jsou nezávislé na platformách a jazycích. Budete si moci také vyzkoušet řadu obklopujících technologií (WSDL, SOAP a UDDI), které umožňují harmonickou komunikaci mezi webovou službou a externím klientem.
40
Sdělte nám svůj názor Jako čtenáři této knihy se stáváte těmi nejdůležitějšími kritiky a komentátory. Vážíme si vašeho názoru a chtěli bychom vědět, co děláme správně, co bychom mohli dělat lépe, ve kterých oblastech bychom měli publikovat a také vaše další podnětné myšlenky, o které jste ochotni se s námi podělit. Jako odborný redaktor Zoner Press vítám vaše názory. Můžete mi psát – poslat e-mail nebo dopis – a sdělit mi, co se vám v této knize líbilo nebo nelíbilo, stejně tak, co bychom měli udělat, aby naše další knihy byly lepší. Pokud mi napíšete, nezapomeňte prosím připojit název knihy, ISBN, jméno autora, vaše jméno, telefon, fax nebo e-mail. Pozorně zhodnotím vaše názory a poskytnu je autorovi a redaktorům, kteří pracovali na této knize. Prosím, vězte, že nemohu pomoci s technickými problémy, které se týkají obsahu knihy, a že díky velkému množství e-mailů, které dostávám, nemohu zaručit odpověď na každou zprávu. E-mail: miroslav.kucera@zoner.com nebo knihy@zoner.cz. Adresa: Zoner Press, ZONER software, s.r.o., Miroslav Kučera, Nové sady 18, 602 00 Brno.
Zdrojové soubory Zdrojové soubory k této knize je možné stáhnout na adrese http://www.zonerpress.cz/download/c_2005_a_platforma_net.zip (9,95 MB). Zdrojové soubory jsou rozděleny do samostatných adresářů podle kapitol. V knize, prosím, nepřehlédněte poznámky označené slovy ZDROJOVÝ KÓD, které vás informují o tom, že právě probíraný příklad v knize je možné načíst do Visual Studia 2005 pro účely dalšího zkoumání nebo jeho modifikace. Poznámky týkající se zdrojového kódu mají tuto podobu: ZDROJOVÝ KÓD Tohle je poznámka vztahující se k právě probíranému zdrojovému kódu, která vás odkáže na konkrétní adresář!
Zdrojový soubor s příkladem otevřete ve Visual Studiu 2005 jednoduše tak, že v patřičném podadresáři najdete a otevřete soubor řešení (*.sln).