Top Banner
E N C Y K L O P E D I E Z O N E R P R E S S Ŏ ešení praktických Ŏ ešení praktických programátorských úloh programátorských úloh C# C# 4.0 4.0 Ben Watson Ben Watson
38

C# 4.0 - řešení praktických programátorských úloh

Mar 22, 2016

Download

Documents

C# 4.0 - řešení praktických programátorských úloh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C# 4.0 - řešení praktických programátorských úloh

E N C Y K L O P E D I E Z O N E R P R E S S

ešení praktických ešení praktických programátorských úlohprogramátorských úloh

C#C# 4.04.0

C# 4.0

B e n W a t s o nB e n W a t s o n

ešení praktických

programátorských úloh

Page 2: C# 4.0 - řešení praktických programátorských úloh
Page 3: C# 4.0 - řešení praktických programátorských úloh

C# 4.0

Ben Watson

řešení praktickýchprogramátorských úloh

Page 4: C# 4.0 - řešení praktických programátorských úloh

C# 4.0 HOW-TOBen Watson

Authorized translation from the English language edition, entitled C# 4.0 HOW-TO, 1st Edition, 0672330636 by WATSON, BEN, published by Pearson Education, Inc, publishing as Sams Publishing, Copyright © 2010 by Ben Watson. All rights reser-ved. 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 Pearson Education, Inc. CZECH language edition published by ZONER SOFTWARE, a.s., Copyright © 2010.

Autorizovaný překlad originálního anglického vydání knihy C# 4.0 HOW-TO, vydání první, ISBN 0672330636, autor WAT-SON, BEN, vydal Pearson Education, Inc, ve vydavatelství Sams Publishing, Copyright © 2010 Ben Watson. 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í Pearson Educa-tion, Inc. České vydání vydal ZONER SOFTWARE, a.s., Copyright © 2010.

C# 4.0 – řešení praktických programátorských úlohAutor: Ben Watson

Copyright © ZONER soft ware, a.s. Vydání první v roce 2010. Všechna práva vyhrazena.

Zoner PressKatalogové číslo: ZR1015

ZONER soft ware, a.s.Nové sady 18, 602 00 Brno

Překlad: RNDr. Jan PokornýOdborný redaktor: Miroslav KučeraTechnický redaktor: Hana FruhwirtováŠéfredaktor: Ing. Pavel KristiánObálka a fotografi e na obálce: Lenka KřížováDTP: Miroslav Kučera

Informace, které jsou v této knize zveřejněny, mohou být 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 dis-tribuová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 soft ware, a.s Nové sady 18, 602 00 Brno

tel.: 532 190 883 e-mail: [email protected] www.zonerpress.cz

ISBN 978-80-7413-094-6

Page 5: C# 4.0 - řešení praktických programátorských úloh

3

Stručný obsah

Část I – Základy C# 21

Kapitola 1 Základy typů 23

Kapitola 2 Vytváření univerzálních typů 43

Kapitola 3 Obecné zásady psaní kódu 61

Kapitola 4 Výjimky 79

Kapitola 5 Čísla 93

Kapitola 6 Výčty 115

Kapitola 7 Řetězce 125

Kapitola 8 Regulární výrazy 147

Kapitola 9 Generiky 155

Část II – Zpracování dat 169

Kapitola 10 Kolekce 171

Kapitola 11 Soubory a serializace 193

Kapitola 12 Sítě a web 217

Kapitola 13 Databáze 253

Kapitola 14 XML 277

Část III – Interakce s uživatelem 293

Kapitola 15 Delegáti, události a anonymní metody 295

Kapitola 16 Formuláře Windows 309

Kapitola 17 Grafi ka s formuláři Windows a GDI+ 343

Kapitola 18 Windows Presentation Foundation (WPF) 379

Kapitola 19 ASP.NET 417

Kapitola 20 Silverlight 457

Část IV – Pokročilé funkce C# 473

Kapitola 21 LINQ 475

Kapitola 22 Správa paměti 487

Kapitola 23 Vlákna, asynchronní a paralelní programování 505

Kapitola 24 Refl exe a vytváření pluginů 533

Kapitola 25 Aplikační vzory a tipy 543

Kapitola 26 Interakce s operačním systémem a hardwarem 589

Kapitola 27 Ostatní záležitosti 609

Dodatek A Nepostradatelné nástroje 633

Page 6: C# 4.0 - řešení praktických programátorských úloh

4

Podrobný obsahÚvod 18

Část I – Základy C# 21

Kapitola 1 Základy typů 23

Vytvoření třídy 24

Defi nice členských proměnných, vlastností a metod 25

Defi nice statických členů 27

Konstruktory 27

Inicializace vlastností při jejich konstrukci 29

Klíčová slova const a readonly 29

Opětovné využívání kódu ve více konstruktorech 30

Odvozování z třídy 31

Volání konstruktoru základní třídy 31

Překrytí metody nebo vlastnosti základní třídy 32

Vytvoření rozhraní 35

Implementace rozhraní 36

Vytvoření struktury 38

Vytvoření anonymního typu 39

Použití abstraktní základní třídy pro zamezení vytváření instancí 40

Rozhraní, nebo abstraktní základní třída? 41

Kapitola 2 Vytváření univerzálních typů 43

Formátování typu s ToString() 44

Jak určit, zda jsou typy shodné? 48

Jak na hašování typů s GetHashCode()? 50

Jak na seřazování typů? 50

Přidělování indexu typům 52

Oznamování klientům, že se něco změnilo 54

Přetěžování operátorů 55

Převod typů na jiné typy 56

Page 7: C# 4.0 - řešení praktických programátorských úloh

5

Jak zabránit dědění 57

Povolení null u hodnotového typu 58

Kapitola 3 Obecné zásady psaní kódu 61

Deklarace proměnných 62

Odložení kontrol typů na dobu běhu (dynamické typy) 63

Dynamické typování pro zjednodušení interoperability s COM 65

Deklarace polí 66

Vytváření vícerozměrných polí 66

Alias jmenného prostoru 67

Podmínkový operátor (:?) 68

Podmínkový operátor (??) zahrnující null 69

Přidávání metod do existujících typů pomocí rozšiřujících metod 70

Volání metod s výchozími parametry 72

Volání metod s pojmenovanými parametry 73

Odložené vytvoření hodnoty až do okamžiku, kdy se na ni odkazuje 73

Vynucení kódových kontraktů 75

Kapitola 4 Výjimky 79

Generování výjimky 80

Zachycení výjimky 80

Zachycení více výjimek 81

Opětovné vygenerování výjimky 82

(Téměř) zaručené vykonání s fi nally 83

Získávání užitečných informací z výjimek 84

Vytvoření vlastní třídy výjimky 86

Zachycení nezpracovaných výjimek 88

Rady pro používání výjimek 92

Kapitola 5 Čísla 93

Volba mezi Float, Double a Decimal 94

Enormně velká celá čísla (BigInteger) 95

Komplexní čísla 96

Formátování čísel v řetězci 98

Page 8: C# 4.0 - řešení praktických programátorských úloh

6

Převod řetězce na číslo 102

Převody mezi číselnými soustavami 103

Převod čísla na bajty (a naopak) 106

Jak určit, zdali je celé číslo sudé? 107

Jak určit, zdali je celé číslo mocnina dvou? 107

Jak určit, zdali je číslo prvočíslem? 108

Jak určit počet jednotkových bitů? 108

Převod stupňů na radiány 109

Zaokrouhlování čísel 110

Generování více náhodných čísel 112

Generování jedinečných identifi kátorů (GUID) 113

Kapitola 6 Výčty 115

Deklarace výčtu 116

Deklarace indikátorů jako výčet 117

Určení, zdali je nastaven konkrétní indikátor 118

Převod výčtu na celé číslo (a naopak) 118

Určení, zda je výčet platný 119

Získání seznamu hodnot výčtu 119

Převod řetězce na výčet 119

Připojování metadat k výčtům pomocí rozšiřujících metod 120

Tipy pro práci s výčty 123

Kapitola 7 Řetězce 125

Převod řetězce na bajty (a naopak) 126

Vytvoření vlastního kódovacího schématu 127

Řádné porovnávání řetězců 131

Změna velikosti písmen 132

Detekce prázdných řetězců 133

Řetězení řetězců: měli byste používat StringBuilder? 133

Řetězení prvků kolekce do řetězce 135

Přidávání znaků pro nový řádek 136

Převod řetězce na pole řetězců 136

Převod binárních dat na řetězec (datový formát Base64) 138

Page 9: C# 4.0 - řešení praktických programátorských úloh

7

Opačné pořadí slov 140

Přirozené seřazení řetězců obsahujících čísla 141

Kapitola 8 Regulární výrazy 147

Vyhledávání textu 148

Extrakce skupin textu 149

Nahrazování textu 149

Shoda a validace 150

Zvyšování výkonu regulárních výrazů 153

Kapitola 9 Generiky 155

Vytvoření generického seznamu 156

Vytvoření generické metody 157

Vytvoření generického rozhraní 158

Vytvoření generické třídy 159

Vytvoření generického delegáta 161

Používání více generických typů najednou 162

Omezování generického typu 162

Převod IEnumerable<Child> na IEnumerable<Parent> (kovariance) 165

Převod IComparer<Child> na IComparer<Parent>(kontravariance) 167

Vytváření entic (dvojice, trojice atd.) 168

Část II – Zpracování dat 169

Kapitola 10 Kolekce 171

Výběr správné třídy pro kolekci 172

Inicializace kolekce 174

Iterace přes kolekci nezávisle na její implementaci 174

Vytvoření vlastní kolekce 175

Vytváření vlastních iterátorů pro kolekci 179

Opačné pořadí prvků pole 183

Opačné pořadí prvků propojeného seznamu 183

Získání jedinečných prvků z kolekce 184

Page 10: C# 4.0 - řešení praktických programátorských úloh

8

Četnosti prvků v kolekci 185

Implementace prioritní fronty 186

Vytvoření prefi xového stromu (Trie) 189

Kapitola 11 Soubory a serializace 193

Vytváření, čtení a zapisování souborů 194

Odstranění souboru 196

Kombinování proudů (komprimace souboru) 197

Získání velikosti souboru 199

Získání bezpečnostních informací o souboru 199

Kontrola existence souboru a adresáře 201

Seznam jednotek 201

Seznam adresářů a souborů 202

Výběr adresáře procházením 203

Vyhledání souboru nebo adresáře 204

Manipulace s cestami souborů 206

Vytváření jedinečných nebo dočasných názvů souborů 208

Sledování změn souborového systému 208

Získání cest ke složkám Dokumenty, Obrázky atd. 210

Serializace objektů 211

Serializace do proudu v paměti 214

Ukládání dat, když má aplikace omezená oprávnění 214

Kapitola 12 Sítě a web 217

Překlad názvu hostitele do IP adresy 218

Získání názvu hostitele a IP adresy aktuálního stroje 218

Ping na nějaký stroj 219

Získání informací o síťové kartě 220

Vytvoření klienta a serveru TCP/IP 221

Odeslání e-mailu přes SMTP 224

Stahování webového obsahu přes HTTP 225

Nahrání souboru z FTP serveru 229

Odstranění HTML značek z textu 230

Vložení webového prohlížeče do aplikace 231

Page 11: C# 4.0 - řešení praktických programátorských úloh

9

Konzumace RSS kanálu 232

Dynamické generování kanálu RSS v IIS 236

Komunikace mezi procesy na tomtéž stroji (WCF) 238

Komunikace mezi dvěma stroji na téže síti (WCF) 245

Komunikace přes internet (WCF) 247

Odhalování služeb za běhu (WCF) 249

Kapitola 13 Databáze 253

Vytvoření nové databáze ve Visual Studiu 254

Připojení k databázi a získávání dat 256

Vkládání dat do databázové tabulky 261

Odstraňování dat z tabulky 262

Spuštění uložené procedury 263

Transakce 264

Vázání dat k ovládacímu prvku pomocí sady dat 266

Detekce, zda je databázové připojení dostupné 273

Automatické mapování dat na objekty s knihovnou Entity Framework 274

Kapitola 14 XML 277

Serializace objektu do XML a z XML 278

Zápis XML úplně od začátku 282

Čtení XML souboru 284

Validace XML dokumentu 286

Dotazy na XML s XPath 288

Transformace databázových dat do XML 289

Transformace XML do HTML 290

Část III – Interakce s uživatelem 293

Kapitola 15 Delegáti, události a anonymní metody 295

Rozhodnutí až při běhu, která metoda se má zavolat 296

Jak se přihlásit k odběru události 298

Publikace události 299

Page 12: C# 4.0 - řešení praktických programátorských úloh

10

Uživatelské rozhraní se musí aktualizovat na jeho vláknu 301

Přiřazení anonymní metody delegátovi 303

Použití anonymní metody jako zpracovatele událostí 304

Jak těžit z výhod kontravariance 306

Kapitola 16 Formuláře Windows 309

Modální a nemodální formuláře 310

Pruh nabídek 311

Dynamické vypínání prvků nabídek 314

Stavový řádek 314

Panel nástrojů 315

Vytvoření rozhraní pro rozdělení okna 316

Dědění formuláře 318

Uživatelský ovládací prvek 322

Časovač 327

Konfi gurační hodnoty pro aplikaci a uživatele 328

Efektivní práce s ListView ve virtuálním režimu 331

Vodorovné posouvání nakláněním kolečka myši 333

Vyjímání a vkládání do schránky 337

Obnovení čekacího kurzoru do původní podoby 342

Kapitola 17 Grafi ka s formuláři Windows a GDI+ 343

Defi nice barev 344

Systémový dialog pro výběr barev 344

Převod barev mezi RGB a HSV 345

Kreslení obrazců 349

Pera 352

Vlastní štětce 354

Transformace 356

Kreslení textu 358

Kreslení textu šikmo 358

Kreslení obrázků 359

Kreslení průhledných obrázků 360

Kreslení do buff eru mimo obrazovku 360

Page 13: C# 4.0 - řešení praktických programátorských úloh

11

Přímý přístup k pixelům bitmapy pro lepší výkon 361

Kreslení s vyhlazováním hran 363

Kreslení bez problikávání 364

Změna velikosti obrázku 365

Vytvoření miniatury obrázku 365

Snímání obsahu obrazovky v prostředí s několika monitory 367

Vzdálenost kurzoru myši od daného bodu 369

Je bod uvnitř daného obdélníka? 370

Je bod uvnitř dané kružnice? 370

Je bod uvnitř dané elipsy? 371

Mají dva obdélníky neprázdný průnik? 372

Tisk a náhled před tiskem 372

Kapitola 18 Windows Presentation Foundation (WPF) 379

Zobrazení okna 380

Volba metody rozvržení 381

Pruh nabídek 381

Stavový řádek 383

Panel nástrojů 383

Standardní příkazy 384

Vlastní příkazy 385

Vypínání a zapínání příkazů 388

Rozbalování a sbalování skupiny ovládacích prvků 389

Reakce na události 390

Oddělení vzhledu od funkcionality 391

Změna stylů při běhu pomocí triggerů 392

Vázání vlastností ovládacího prvku k jinému objektu 393

Formátování hodnot během vázání dat 398

Převod hodnot na jiný typ během vázání dat 398

Vázání ke kolekci 399

Defi nice způsobu pro zobrazování vázaných dat 400

Defi nice vzhledu ovládacích prvků pomocí šablon 401

Animace vlastností prvku 402

Realizace trojrozměrné geometrie 403

Page 14: C# 4.0 - řešení praktických programátorských úloh

12

Video na trojrozměrném povrchu 406

Interaktivní ovládací prvky na trojrozměrném povrchu 409

WPF v aplikacích formulářů Windows 413

Formuláře Windows v aplikaci WPF 414

Kapitola 19 ASP.NET 417

Prohlížení ladicích a sledovacích informací 418

Zjištění schopností webového prohlížeče 420

Přesměrování na jinou stránku 421

Formulářová autentizace pro přihlašování uživatelů 423

Jednotný vzhled se vzorovými stránkami 426

Přidání navigačního menu 427

Vázání dat ke GridView 428

Vytvoření uživatelského ovládacího prvku 430

Tvorba fl exibilního uživatelského rozhraní s Web Parts 434

Vytvoření jednoduché ajaxové stránky 439

Ověřování platnosti dat 441

Udržování stavu aplikace 445

Udržování stavu uživatelského rozhraní 446

Udržování uživatelských dat v relaci 447

Uložení stavu relace 449

Použití cookies pro obnovení stavu relace 450

ASP.NET Model-View-Controller (MVC) 451

Kapitola 20 Silverlight 457

Vytvoření projektu Silverlightu 458

Přehrávání videa 459

Sestavení ukazatele průběhu pro stahování a přehrávání 463

Reakce na události časovače na vláknu uživatelského rozhraní 465

Obsah v trojrozměrné perspektivě 466

Běh aplikace bez webového prohlížeče 467

Zobrazení výstupu z webové kamery 469

Tisk dokumentu 471

Page 15: C# 4.0 - řešení praktických programátorských úloh

13

Část IV – Pokročilé funkce C# 473

Kapitola 21 LINQ 475

Dotaz na objekt kolekce 476

Seřazení výsledků 478

Filtrování kolekce 478

Získání kolekce částí objektů (projekce) 479

Slučování tabulek 479

Dotaz na XML 480

Vytvoření XML 481

Dotazování s Entity Framework 481

Dotaz na webovou službu (LINQ to Bing) 483

Urychlování dotazů s PLINQ (paralelní LINQ) 486

Kapitola 22 Správa paměti 487

Kolik paměti používá aplikace 488

Úklid neřízených prostředků pomocí fi nalizace 489

Úklid řízených prostředků pomocí vzoru propouštění 491

Vynucený svoz odpadků 496

Vytvoření cache, která umožňuje svoz odpadu 496

Ukazatele 500

Urychlení přístupu k poli 501

Zamezení přesunů paměti 502

Alokace neřízené paměti 503

Kapitola 23 Vlákna, asynchronní a paralelní programování 505

Snadná dělba práce mezi procesory 506

Používání datových struktur ve více vláknech 510

Asynchronní volání metody 510

Fond vláken 512

Vytvoření vlákna 512

Výměna dat s vláknem 513

Ochrana dat používaných ve více vláknech 515

Page 16: C# 4.0 - řešení praktických programátorských úloh

14

Použití metody třídy Interlocked místo zámků 517

Ochrana dat ve více procesech 518

Omezení aplikace na jedinou instanci 520

Omezení počtu vláken, která mohou přistupovat k prostředku 520

Signalizace vláknům událostmi 523

Vícevláknový časovač 526

Zámek typu Reader-Writer 527

Použití asynchronního programovacího modelu 529

Kapitola 24 Refl exe a vytváření pluginů 533

Jmenovitý seznam typů v assembly 534

Přidání vlastního atributu 535

Dynamické vytvoření instance třídy 537

Vyvolání metody na dynamicky vytvořené instanci třídy 537

Implementace pluginové architektury 539

Kapitola 25 Aplikační vzory a tipy 543

Stopky pro potřeby profi lace kódu 544

Vyznačování zastaralého kódu 545

Zkombinování událostí do jediné události 546

Implementace vzoru pozorovatel 551

Zprostředkovatel událostí 554

Uložení pozice aplikace na obrazovce 558

Implementace funkce Zpět pomocí objektů příkazů 559

Vzor Model-View-ViewModel ve WPF 567

Lokalizace 577

Lokalizace aplikace formulářů Windows 578

Lokalizace aplikace ASP.NET 579

Lokalizace aplikace WPF 581

Lokalizace aplikace Silverlightu 585

Nasazení aplikace do provozu s ClickOnce 587

Kapitola 26 Interakce s operačním systémem a hardwarem 589

Verze operačního systému, opravného balíčku a CLR 590

Page 17: C# 4.0 - řešení praktických programátorských úloh

15

Informace o CPU a dalším hardwaru 590

Vyžádání oprávnění správce vyvoláním Řízení uživatelských účtů 593

Zapisování do protokolu událostí 595

Přístup k registru 597

Správa služeb Windows 599

Vytvoření služby Windows 599

Volání nativních funkcí Windows pomocí P/Invoke 602

Volání funkcí C v DLL z C# 603

Paměťově mapované soubory 604

Zajištění, aby aplikace pracovala v 32bitovém i 64bitovém prostředí 605

Reakce na změny v konfi guraci systému 606

Využití předností funkcí Windows 7 607

Informace o stavu napájení 608

Kapitola 27 Ostatní záležitosti 609

Okno, které není obdélníkové 610

Ikona pro oznamovací oblast 614

Spořič obrazovky ve WPF 617

Úvodní obrazovka 626

Přehrání zvukového souboru 631

Míchání karet 632

Dodatek A Nepostradatelné nástroje 633

Refl ector 634

NUnit 635

NDepend 638

FXCop 639

Virtual PC 640

Process Explorer a Process Monitor 641

RegexBuddy 642

LINQPad 643

Kde najdete další nástroje 644

Rejstřík 645

Page 18: C# 4.0 - řešení praktických programátorských úloh

16

VěnováníRodičům, Michaelu a Dianně Watsonovým, kteří se mi v mých pubertálních letech přinejmenším dvakrát podvolili, když jsem jim podrobně zdůvodňoval, proč by mi měli koupit software kompilá-toru C++, a kteří dělali všechno, co bylo v jejich silách, aby rozvíjeli to, na co jsem měl nadání a co mě zajímalo. Bez jejich vzoru, lásky a rad bych nikdy ničeho nedosáhl.

Mé báječné ženě Leticii, která byla nanejvýš trpělivá a  laskavá, když jsem se pustil do  nového a strastiplného projektu během těch všech ostatních změn v našem životě.

PoděkováníJsem velmi vděčný lidem, kteří sešli ze své cesty proto, aby mi pomohli s touto knihou:

Brooku Farlingovi (editor), že mě našel a dal mi tuto příležitost, za veškerou jeho koordinač-ní práci, trpělivost a tah na branku, aby se podařilo knihu vydat.

Marku Strawmayerovi (korektor), že prošel kód a text a zajistil kvalitu toho, co je v knize.

Publikačnímu týmu u Sams, což byl Mark Renfrow, Lori Lyons, Bart Reed, Nonie Ratcliff, Sheri Cain.

Page 19: C# 4.0 - řešení praktických programátorských úloh

17

O autoroviBen Watson vyvíjí v .NET od chvíle, kdy bylo vydáno. Než se přidal k Microsoftu, pracoval jako vůdčí vývojář pro firmu GeoEye, kde v .NET vyvinul komunikační systémy pro námořnictvo. Na-posled pracoval v týmu Query Pipeline pro Bing, kde pomáhal navrhovat a implementovat masiv-ně škálovatelné distribuované systémy a další interní záležitosti tohoto vyhledávače.

Sdělte nám svůj názorJako č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 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 všem lidem, 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ů, jež dostávám, nemohu zaručit odpověď na každou zprávu.

E-mail: [email protected] nebo [email protected].

Adresa: Zoner Press

ZONER software, a.s.

Miroslav Kučera

Nové sady 18, 602 00 Brno

Zdrojové souboryZdrojové soubory k této knize lze stáhnout z následující adresy:

http://zonerpress.cz/download/C_4_0_reseni_praktickych_uloh.zip

Velikost souboru ke stažení je cca 31 MB.

Page 20: C# 4.0 - řešení praktických programátorských úloh

18

ÚvodTato kniha přistupuje ke svému tématu hodně odlišně než typické programovací příručky. Tím, že je strukturována do návodů ve formě praktických postupů ve stylu "jak na to", předkládá látku ve scénářích rozložených na kroky, které se snadno reprodukují. V jednotlivých návodech jsem se snažil omezit vysvětlující text na nezbytné minimum, abych se mohl plně soustředit na samotný kód. V kódech nechybí komentáře, které vysvětlují jeho netriviální úseky.

Kniha není pouhou strohou učebnicí jazyka či knihovnou. Neprobírají se zde pouze samotné funk-ce jazyka, uvidíte propracované praktické ukázky aplikačních vzorů, užitečné algoritmy i řadu ši-kovných tipů, prostě všechno, co můžete využít v mnoha situacích.

Vývojáři, jak začínající, tak i pokročilí, najdou v této knize stovky užitečných témat. Ať už je to sekce o méně známých operátorech C#, nebo jak seřazovat řetězce obsahující čísla, nebo jak imple-mentovat funkci Zpět (Undo), kniha prostě obsahuje hotová řešení, která jsou užitečná v mnoha rozličných situacích, bez ohledu na to, jakou úrovní dovedností je vývojář vybaven.

Zkrátka, je to ten druh knihy, který jsem chtěl mít na svém stole neustále po ruce, když jsem se poprvé učil programovat a zároveň jazyk C#, vždy, když jsem si něco potřeboval rychle ověřit nebo si připomenout, jak se dělá to či ono.

Jak z knihy vytěžit co nejvícTuto knihu jsem navrhl tak, aby se snadno četla po jednotlivých tématech. Mým cílem je, abyste plně porozuměli jazyku C# 4.0. Předmět výkladu je rozdělen do čtyř částí, které jsou složeny z ka-pitol, v nichž se snadno orientuje a snadno se s nimi pracuje.

Část I, "Základy C#", se věnuje běžné funkcionalitě C#, kterou budete využívat pokaždé, bez ohle-du na to, co budete programovat. Ačkoliv se někomu může zdát jako příliš elementární, obsahuje spoustu užitečných rad, takže budete schopni vytěžit maximum i ze základních témat.

Kapitola 1 – Základy typů

Kapitola 2 – Vytváření univerzálních typů

Kapitola 3 – Obecné zásady psaní kódu

Kapitola 4 – Výjimky

Kapitola 5 – Čísla

Kapitola 6 – Výčty

Kapitola 7 – Řetězce

Kapitola 8 – Regulární výrazy

Kapitola 9 – Generiky

Page 21: C# 4.0 - řešení praktických programátorských úloh

19

V  části II, "Zpracování dat", detailně prodiskutujeme problematiku ukládání dat a  manipulace s nimi (včetně práce s daty umístěnými někde na internetu).

Kapitola 10 – Kolekce

Kapitola 11 – Soubory a serializace

Kapitola 12 – Sítě a web

Kapitola 13 – Databáze

Kapitola 14 – XML

V části III, "Interakce s uživatelem", se probírají nejoblíbenější paradigmata uživatelského rozhraní v .NET, ať už pracujete na své ploše, na webech, nebo děláte obojí.

Kapitola 15 – Delegáti, události a anonymní metody

Kapitola 16 – Formuláře Windows

Kapitola 17 – Grafika s formuláři Windows a GDI+

Kapitola 18 – Windows Presentation Foundation (WPF)

Kapitola 19 – ASP.NET

Kapitola 20 – Silverlight

V části IV, "Pokročilé funkce C#", se probírají pokročilejší témata. Jedná se o látku, s jejíž pomocí dostanete své aplikace na kvalitativně vyšší úroveň, pokud jde o výkon, návrhové vzory, užitečné algoritmy a další aspekty.

Kapitola 21 – LINQ

Kapitola 22 – Správa paměti

Kapitola 23 – Vlákna, asynchronní a paralelní programování

Kapitola 24 – Reflexe a vytváření pluginů

Kapitola 25 – Aplikační vzory a tipy

Kapitola 26 – Interakce s operačním systémem a s hardwarem

Kapitola 27 – Ostatní záležitosti

Dodatek A – Nepostradatelné nástroje

Veškerý kód jsme naprogramovali ve Visual Studiu 2010, v  mnoha případech ovšem vystačíte i s dřívějšími verzemi, zejména jedná-li se o kód, který nepožaduje .NET 4. Nemáte-li Visual Stu-dio, můžete si ze stránek www.microsoft.com/express/default.aspx stáhnout verzi Express. S touto verzí budete schopni sestavit prakticky všechny ukázky kódu uvedené v této knize.

Page 22: C# 4.0 - řešení praktických programátorských úloh

20

Jak dále rozvíjet své vědomosti Žádná samostatná kniha nemůže plně pokrýt C# a .NET Framework. Dokonce ani nemůže doufat, že se jí podaří vyčerpávajícím způsobem probrat nějaké dílčí téma z tohoto světa. A i kdyby taková kniha existovala, patrně byste ji vůbec neunesli a celý svůj život strávili její četbou.

Jakmile však zvládnete základy, existuje spousta zdrojů, v nichž můžete najít odpovědi na své další otázky, a hlouběji se ponořit do .NET.

MSDN dokumentace pro .NET, která je umístěna na  http://msdn.microsoft.com/en-us/aa139615.aspx, je naprosto prvotřídní. U většiny témat najdete nejenom ukázky kódu, ale i vy-světlení toho, jak se používají. Jako bonus navíc má kdokoliv možnost přidat na konec každého tématu užitečný obsah. Najde se tam spousta dobrých tipů od ostatních vývojářů .NET.

Vývojářská fóra .NET, viz adresa http://social.msdn.microsoft.com/Forums/en-US/ca-tegory/netdevelopment, jsou vynikajícím místem, kde můžete získat odpovědi na  své otázky od expertů, z nichž mnozí se podíleli na vývoji a testování .NET.

Zjistil jsem také, že dobrým místem pro otázky je web StackOverflow.com.

Nejlepší rada, kterou vám ohledně rozvíjení vašich vědomostí mohu dát, je ta, abyste prostě psali software. Vydržte u toho, přemýšlejte o nových projektech, používejte nové technologie, snažte se překračovat své momentální schopnosti. Tato i jiné knihy jsou velmi užitečné, ale pochopitelně jen do jisté hranice. Pak už nezbude nic jiného, než abyste do toho skočili po hlavě a začali psát kód. Při této činnosti vám kniha vždy poslouží jako spolehlivá referenční příručka, nebudete-li náhodou vědět, jak se pustit do nějakého tématu.

Mnoho štěstí při kódování!

Page 23: C# 4.0 - řešení praktických programátorských úloh

21

Základy C#

ČÁST I

Obsah této části:

Kapitola 1 Základy typů

Kapitola 2 Vytváření univerzálních typů

Kapitola 3 Obecné zásady psaní kódu

Kapitola 4 Výjimky

Kapitola 5 Čísla

Kapitola 6 Výčty

Kapitola 7 Řetězce

Kapitola 8 Regulární výrazy

Kapitola 9 Generiky

Page 24: C# 4.0 - řešení praktických programátorských úloh
Page 25: C# 4.0 - řešení praktických programátorských úloh

23

Základy typů

KAPITOLA 1

Obsah této kapitoly:

Vytvoření třídy

Definice členských proměnných, vlastností a metod

Definice statických členů

Konstruktory

Inicializace vlastností při jejich konstrukci

Klíčová slova const a  readonly

Opětovné využívání kódu ve více konstruktorech

Odvozování z třídy

Volání konstruktoru základní třídy

Překrytí metody nebo vlastnosti základní třídy

Vytvoření rozhraní

Implementace rozhraní

Vytvoření struktury

Vytvoření anonymního typu

Použití abstraktní základní třídy pro zamezení vytváření instancí

Rozhraní, nebo abstraktní základní třída?

Page 26: C# 4.0 - řešení praktických programátorských úloh

24 Kapitola 1 – Základy typů

V této kapitole si vysvětlíme základy, jak vytvářet typy v C#. Jestliže už něco o C# víte, poslouží vět-šina kapitoly jako rekapitulace. Poté, co probereme členy třídy, mezi něž patří členské proměnné, vlastnosti a  metody, dozvíte se něco více o konstruktorech a vytváření (a implementaci) rozhraní. Také se dozvíte, kdy se mají používat struktury.

Ačkoliv informace obsažené v této kapitole jsou základní, lze je označit za důležité. Podobně jako u mnoha jiných věcí i zde platí, že pokud nemáte v malíčku základy, nikdy nic neuděláte pořádně.

Vytvoření třídy

Scénář/problém. Potřebujete vytvořit deklaraci nějaké třídy.

Řešení. Začněme něčím jednoduchým. Deklarujme třídu, která bude obsahovat souřadnice bodu v trojrozměrném prostoru.

// Výchozí jmenné prostory, které se mají importovat,

// Visual Studio je zařadí do každého souboru

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ClassSample

{

// Veřejná, takže bude viditelná vně assembly

public class Vertex3d

{

}

}

Třída, kterou jsme nadefinovali, je prozatím prázdná, ale v této kapitole ji postupně naplníme.

Třída je definovaná jako veřejná (public), což znamená, že je viditelná pro jakýkoliv další typ, který se odkazuje na její assembly. Programovací jazyk C# definuje několik modifikátorů přístupu, které jsou podrobně uvedeny v tabulce 1.1.

Tabulka 1.1. Modifikátory přístupu.

Přístup Aplikovatelné na Popis

Veřejný (public) Typy, členy Přístupné všem, dokonce i vně assembly

Privátní (private) Typy, členy Přístupné kódu v tomtéž typu

Interní (internal) Typy, členy Přístupné kódu v tomtéž assembly

Page 27: C# 4.0 - řešení praktických programátorských úloh

25C# 4.0 – řešení praktických programátorských úloh

Přístup Aplikovatelné na Popis

Chráněný (protected) Členy Přístupné kódu v tomtéž typu nebo odvozeném typu

Chráněný interní (protected internal)

Členy Přístupné kódu v tomtéž assembly nebo odvozené třídě v jiném assembly

Jestliže třída nespecifikuje svou přístupnost, výchozí je internal.

Definice členských proměnných, vlastností a metod

Scénář/problém. Potřebujete do defi nice třídy přidat členské proměnné, vlastnosti a metody.

Řešení. Přidejte základní prvky třídy Vertex3d, aby mohla být k něčemu užitečná.

public class Vertex3d

{

// Členské proměnné (fields)

private double _x;

private double _y;

private double _z;

// Vlastnosti

public double X

{

get { return _x; }

set { _x = value; }

}

public double Y

{

get { return _y; }

set { _y = value; }

}

public double Z

{

get { return _z; }

set { _z = value; }

}

// Metoda

public void SetToOrigin()

{

X = Y = Z = 0.0;

Page 28: C# 4.0 - řešení praktických programátorských úloh

26 Kapitola 1 – Základy typů

}

}

Pár poznámek k předchozímu kódu:

Všechny členské proměnné jsou deklarovány jako privátní (private), což se obecně dopo-ručuje.

Ačkoli vlastnosti jsou deklarovány jako veřejné (public), mohou být také privátní (priva-te), chráněné (protected) nebo chráněné interní (protected internal), jak si přejete.

Vlastnosti mohou mít get, set, nebo obojí.

Ve vlastnostech je value implicitní argument (neboli předpokládaný v kódu).

V následujícím příkladu by se do X předala hodnota 13.0 v argumentu value.

Vertex3d v = new Vertex3d();

v.X = 13.0;

Automaticky implementované vlastnostiČasto uvidíte kód tohoto druhu:

class MyClass

{

private int _field = 0;

public int Field { get { return _field; } { set { _field = value; } }

}

Pro něj má C# zkrácený zápis:

class MyClass

{

public int Field { get; set; }

// Hodnota se nyní musí inicializovat v konstruktoru

public MyClass()

{

this.Field = 0;

}

}

Poznámka. Nemůžete mít automaticky implementovanou vlastnost, která by měla pouze get (po-kud byste neměli žádnou podpůrnou členskou proměnnou, jakým způsobem byste nastavili vlast-nost?), nicméně může mít privátní set:

public int Field { get; private set; }

Page 29: C# 4.0 - řešení praktických programátorských úloh

27C# 4.0 – řešení praktických programátorských úloh

Definice statických členů

Scénář/problém. Potřebujete defi novat data nebo metody, které se aplikují na typ, nikoliv na jednotli-vé instance. Často se také využívají u metod, které operují na více instancích daného typu.

Řešení. Přidejte klíčové slovo static, viz následující metoda, která sčítá dva objekty typu Ver-tex3d.

public class Vertex3d

{

...

public static Vertex3d Add(Vertex3d a, Vertex3d b)

{

Vertex3d result = new Vertex3d();

result.X = a.X + b.X;

result.Y= a.Y + b.Y;

result.Z = a.Z + b.Z;

return result;

}

}

Statická metoda se volá takto:

Vertex3d a = new Vertex3d(0,0,1);

Vertex3d b = new Vertex3d(1,0,1);

Vertex3d sum = Vertex3d.Add(a,b);

Konstruktory

Scénář/problém. Potřebujete automaticky inicializovat nové objekty třídy.

Řešení. Definujte speciální metodu, které se říká konstruktor. Má stejný název jako třída a nemá žádný návratový typ. Konstruktor se spustí poté, co se vytvořil typ; nikdy se nevolá přímo.

Podívejte se nyní na dva konstruktory pro třídu Vertex3d – jeden přebírá argumenty, druhý pro-vádí jistou výchozí inicializaci.

class Vertex3d

{

public Vertex3d()

Page 30: C# 4.0 - řešení praktických programátorských úloh

28 Kapitola 1 – Základy typů

{

_x = _y = _z = 0.0;

}

public Vertex3d(double x, double y, double z)

{

this._x = x;

this._y = y;

this._z = z;

}

}

Poznámka. Konstruktory nemusejí být veřejné. Například můžete označit konstruktor jako chráněný (protected), čímž bude přístupný pouze z odvozených tříd. Dokonce můžete mít privátní konstruktor, aby se zabránilo vytváření instancí (u pomocných tříd), nebo aby byl přístupný pouze z jiných metod téže třídy (patrně půjde o  statické tovární metody).

Statický konstruktor a inicializace

Scénář/problém. Třída má statická data, která je potřeba inicializovat.

Řešení. Statické členské proměnné se dají inicializovat dvěma způsoby. Prvním způsobem je sta-tický konstruktor, což je obdoba standardního konstruktoru, ovšem s tím rozdílem, že nemá mo-difikátory přístupu a ani argumenty:

public class Vertex3d

{

private static int _numInstances;

static Vertex3d()

{

_numInstances = 0;

}

...

}

Kvůli lepšímu výkonu se ovšem dává vždy, kdykoliv je to možné, přednost inicializaci statických členských proměnných, jak to vidíte zde:

public class Vertex3d

{

private static int _numInstances = 0;

}

Page 31: C# 4.0 - řešení praktických programátorských úloh

217

Sítě a web

KAPITOLA 12

Obsah této kapitoly:

Překlad názvu hostitele do IP adresy

Získání názvu hostitele a IP adresy aktuálního stroje

Ping na nějaký stroj

Získání informací o síťové kartě

Vytvoření klienta a serveru TCP/IP

Odeslání e-mailu přes SMTP

Stahování webového obsahu přes HTTP

Nahrání souboru z FTP serveru

Odstranění HTML značek z textu

Vložení webového prohlížeče do aplikace

Konzumace RSS kanálu

Dynamické generování kanálu RSS v IIS

Komunikace mezi procesy na tomtéž stroji (WCF)

Komunikace mezi dvěma stroji na téže síti (WCF)

Komunikace přes internet (WCF)

Odhalování služeb za běhu (WCF)

Page 32: C# 4.0 - řešení praktických programátorských úloh

218 Kapitola 12 – Sítě a web

Jen výjimečně dnes najdeme aplikaci, která nemá žádnou funkcionalitu spojenou s  internetem. Softwarový svět je stále více a více propojený a u většiny softwaru se očekává, že bude mít nějakou síťovou funkcionalitu, i kdyby to mělo být jen něco tak triviálního, jako je kontrola aktualizací.

Ačkoliv k dobrým řešením síťových úloh vede trnitá cesta, tato kapitola vás posune o hezký kus dopředu. Předvedu vám několik úloh, z nichž několik lze označit za vysloveně základní.

Překlad názvu hostitele do IP adresy

Scénář/problém. Potřebujete přeložit název hostitele, jako je microsoft.com, do jeho IP adres.

Řešení. Hodně funkcionality, se kterou se setkáte v této dvanácté kapitole, obsahuje jmenný pro-stor System.Net (včetně tak základních věcí, jako jsou třídy IPAddress a Dns).

string host = "www.microsoft.com";

// Připomínám, že hostitel může mít více IP adres

IPAddress[] addresses = Dns.GetHostAddresses(host);

foreach (IPAddress addr in addresses)

{

Console.Write("\t{0}", addr);

}

Podívejte se na výstup z ukázkového běhu pro několik běžných hostitelských názvů:

www.microsoft.com

207.46.19.254 207.46.19.190

www.live.com

204.2.160.40 204.2.160.49

www.google.com

208.67.219.230 208.67.219.231

www.yahoo.com

209.131.36.158

Získání názvu hostitele a IP adresy aktuálního stroje

Scénář/problém. Chcete získat hostitelský název a IP adresy aktuálního stroje.

Řešení. K řešení z předchozí sekce stačí přidat volání, kterým získáte název aktuálního hostitele.

Page 33: C# 4.0 - řešení praktických programátorských úloh

219C# 4.0 – řešení praktických programátorských úloh

string hostname = Dns.GetHostName();

Console.WriteLine(" Název hostitele: {0}", hostname);

IPAddress[] addresses = Dns.GetHostAddresses(hostname);

foreach (IPAddress addr in addresses)

{

Console.WriteLine("IP adresa: {0} ({1})",

addr.ToString(), addr.AddressFamily);

}

A takhle vypadá výstup na mém stroji. Povšimněte si v seznamu IPv6 adres:

Název hostitele: Ben-Desktop

IP adresa: fe80::2c4c:372:e7ee:35b7%14 (InterNetworkV6)

IP adresa: fe80::c1aa:9268:a7f0:a203%8 (InterNetworkV6)

IP adresa: 192.168.1.2 (InterNetwork)

IP adresa: 2001:0:4137:9e50:2c4c:372:e7ee:35b7 (InterNetworkV6)

Ping na nějaký stroj

Scénář/problém. Potřebujete detekovat, zdali jsou síť nebo hostitel dostupní.

Řešení. .NET obsahuje rozhraní, které umožňuje udělat tzv. ping. Toto rozhraní podporuje syn-chronní a  asynchronní operace:

System.Net.NetworkInformation.Ping ping =

new System.Net.NetworkInformation.Ping();

System.Net.NetworkInformation.PingReply reply = ping.Send("yahoo.com");

Console.WriteLine("adresa: {0}", reply.Address);

Console.WriteLine("volby: don’t fragment: {0}, TTL: {1}",

reply.Options.DontFragment, reply.Options.Ttl);

Console.WriteLine("cesta tam a zpět: {0}ms", reply.RoundtripTime);

Console.WriteLine("stav: {0}", reply.Status);

Poznámka. Mnohé sítě jsou nakonfi gurovány tak, že nepovolují ping vně svých lokálních sítí. Při po-užívání této funkcionality tak musíte zachytávat PingException a prohlížet vnitřní výjimky, abyste se dozvěděli konkrétní příčinu nezdaru. Když se podíváte do dokumentace MSDN na metodu Send(), naleznete další možné druhy výjimek.

Page 34: C# 4.0 - řešení praktických programátorských úloh

220 Kapitola 12 – Sítě a web

Výstup vypadá takto:

adresa: 69.147.114.224

volby: don’t fragment: False, TTL: 49

cesta tam a zpět: 111ms

stav: Success

Získání informací o síťové kartě

Scénář/problém. Chcete získat nízkoúrovňové informace o všech síťových adaptérech v počítači.

Řešení. Tuto funkčnost nabízí třída System.Net.NetworkInformation.NetworkInterface.

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

foreach (NetworkInterface nic in nics)

{

// V zásadě jde jen o to, dotázat se na houf vlastností

Console.WriteLine("ID: {0}", nic.Id);

Console.WriteLine("Název: {0}", nic.Name);

Console.WriteLine("Fyzická adresa: {0}", nic.GetPhysicalAddress());

IPInterfaceProperties props = nic.GetIPProperties();

PrintIPCollection("DHCP Servery: ", props.DhcpServerAddresses);

}

Kompletní kód najdete v projektu NicInfo ve zdrojových kódech pro tuto kapitolu.

A takto vypadá výstup pro jeden adaptér:

ID: {6B124BB0-CFBE-4DA8-831E-3FD323733CD4}

Název: Local Area Connection

Popis: Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller

Typ: Ethernet

Stav: Up

Rychlost: 100000000

Podporuje Multicast: True

Jen přijímat: False

Fyzická adresa: 000129A4C39B

DHCP Servery:

DNS Servery: 208.67.222.222 208.67.220.220

Page 35: C# 4.0 - řešení praktických programátorských úloh

221C# 4.0 – řešení praktických programátorských úloh

Vytvoření klienta a serveru TCP/IP

Scénář/problém. Jste v  situaci, kdy existující přenosový protokol nevyhovuje vašim potřebám. Pro vysvětlení – protokol HTTP může být příliš zjednodušující, SOAP příliš těžký a  RPC příliš složitý. Také nemůžete použít ani WCF (Windows Communication Foundation). V takové situaci budete muset na-vrhnout svůj vlastní protokol aplikační úrovně, který bude postaven na TCP/IP.

Řešení. V .NET se klient i server TCP/IP vytvoří velmi lehce. Pusťme se nejprve do vytvoření ser-veru, viz výpis 12.1. Jeho logika je snadná na pochopení:

Spustíme cyklus. V něm čekáme na nějaké připojení.

Jakmile se připojení uskuteční, vytvoříme vlákno, abychom je mohli zpracovat.

Získáme zprávu.

Odešleme odpověď.

Uzavřeme připojení a vrátíme se z vlákna.

Výpis 12.1. TCP server.using System;

using System.Net.Sockets;

using System.Net;

using System.Text;

using System.Threading;

namespace TcpServer

{

class Program

{

static void Main(string[] args)

{

IPAddress localhost = IPAddress.Parse("127.0.0.1");

TcpListener listener =

new System.Net.Sockets.TcpListener(localhost, 1330);

listener.Start();

while (true)

{

Console.WriteLine("Čekáme na připojení");

// AcceptTcpClient čeká na nějaké připojení z klienta

TcpClient client = listener.AcceptTcpClient();

// Nastartujeme nové vlákno, abychom mohli zpracovat toto připojení,

// takže můžeme jít zpět a čekat na dalšího klienta

Page 36: C# 4.0 - řešení praktických programátorských úloh

222 Kapitola 12 – Sítě a web

Thread thread = new Thread(

new ParameterizedThreadStart(HandleClientThread));

thread.Start(client);

}

}

static void HandleClientThread(object obj)

{

TcpClient client = obj as TcpClient;

bool done = false;

while (!done)

{

string received = ReadMessage(client);

Console.WriteLine("Přijato: {0}", received);

done = received.Equals("bye");

if (done) SendResponse(client, "BYE");

else SendResponse(client, "OK");

}

client.Close();

Console.WriteLine("Připojení uzavřeno");

}

private static string ReadMessage(TcpClient client)

{

byte[] buffer = new byte[256];

int totalRead = 0;

// Čte bajty, dokud proud neindikuje, že další nejsou

do

{

int read = client.GetStream().Read(buffer, totalRead,

buffer.Length - totalRead);

totalRead += read;

} while (client.GetStream().DataAvailable);

return Encoding.Unicode.GetString(buffer, 0, totalRead);

}

private static void SendResponse(TcpClient client, string message)

{

// Zajistěte, aby se na druhém konci dekódovalo se stejným formátem!

byte[] bytes = Encoding.Unicode.GetBytes(message);

client.GetStream().Write(bytes, 0, bytes.Length);

}

}

}

Page 37: C# 4.0 - řešení praktických programátorských úloh

223C# 4.0 – řešení praktických programátorských úloh

Jediný způsob, jak se dá zastavit běh tohoto serveru, je použít klávesovou zkratku Ctrl+C (což je v podstatě standard pro konzolové servery).

Nyní se pustíme do klienta, viz výpis 12.2. Jeho logika je neméně průzračná:

Připojíme se k serveru.

Běháme v cyklu, dokud nedostaneme signál, že máme skončit.

Odešleme zprávu.

Přečteme odpověď.

Je-li odpověď "BYE", signalizuje to konec.

Výpis 12.2. TCP klient.using System;

using System.Text;

using System.Net;

using System.Net.Sockets;

namespace TcpClientTest

{

class Program

{

static void Main(string[] args)

{

TcpClient client = new TcpClient("127.0.0.1", 1330);

bool done = false;

Console.WriteLine("Napište ‘bye’, chcete-li připojení ukončit");

while (!done)

{

Console.Write("Zadejte zprávu, která se má odeslat na server: ");

string message = Console.ReadLine();

SendMessage(client, message);

string response = ReadResponse(client);

Console.WriteLine("Odpověď: " + response);

done = response.Equals("BYE");

}

}

private static void SendMessage(TcpClient client,string message)

{

// Zajistěte, aby se na druhém konci kódovalo se stejným formátem!

byte[] bytes = Encoding.Unicode.GetBytes(message);

client.GetStream().Write(bytes, 0, bytes.Length);

}

Page 38: C# 4.0 - řešení praktických programátorských úloh

ešení praktických programátorských úloh

C# 4.0

C# 4.0

B e n W a t s o n9 7 8 8 0 7 4   1 3 0 9 4 6

ISBN 978-80-7413-094-6KATALOGOVÉ ČÍSLO: ZR1015DOPORUČENÁ CENA: 539 kč

C# 4.0 řešení praktických programátorských úlohBen Watson

E N C Y K L O P E D I E Z O N E R P R E S S

Pod tímto logem vycházejí publikace určené pro každého vážného zájemce o práci s počítačem. Od ryze praktických příruček a průvodců až po kom-plexní publikace o všem, co potřebuje grafi k, webdesignér, vývojář či pro-gramátor při každodenní práci. Na slevy, které můžete získat, a vydavatelský plán, v němž vedle knih do-mácích odborníků najdete celou řadu titulů světově uznávaných autorů, se informujte na adrese vydavatelství.

Sháníte rychlá, robustní a efektivní programovací řešení pro Microsoft C# 4.0? Pak je tato kniha přesně to, co hledáte. Najdete v ní přes 200 hotových řešení, nejlepší praktiky či vyzkoušené ukázky kódu pro všechno možné (od tříd po výjimky, od sítí po XML, od LINQ po Silverlight). Kniha zahrnuje hlavní rozšíření jazyka, která byla představena v C# 4.0 a .NET 4.0. Pokud trpíte chronickým nedostatkem času, na nic nečekejte a začněte rovnou zde. Získejte hned teď odpovědi, jimž můžete důvěřovat, a kód, který můžete hned používat. Témata popisovaná v knize:

• Základy typů• Vytváření univerzálních typů• Obecné zásady psaní kódu• Výjimky• Čísla• Výčty• Řetězce• Regulární výrazy• Generiky• Kolekce• Soubory a serializace• Sítě a web• Databáze

• XML• Delegáti, události a anonymní metody• Formuláře Windows• Grafi ka s formuláři Windows a GDI+• Windows Presentation Foundation (WPF)• ASP.NET• Silverlight• LINQ• Správa paměti• Vlákna, asynchronní a paralelní programování• Refl exe a vytváření pluginů• Aplikační vzory a tipy• Interakce s operačním systémem a hardwarem

O autoroviBen Watson je softwarový inženýr z týmu Bing společnosti Microsoft. Pomá-há navrhovat a implementovat masivně škálovatelné distribuované systémy a další interní záležitosti pro vyhledávač Bing. Než se přidal k Microsoftu, pra-coval jako vůdčí vývojář pro GeoEye, což je hlavní poskytovatel satelitního zob-razování. Bloguje na PhilosophicalGeek.com, kde zveřejnil spoustu populárních návodů pro psaní kódu v C# a C++.

© F

oto:

Len

ka K

řížov

á

www.zoner.cz

ZONER software, a.s. významný producent softwaru v oblasti digitální fotogra e,

po íta ové gra ky a multimédií, poskytovatel internetových

služeb, souvisejících s prezentací na internetu a e-komercí,

a nakladatelství odborné literatury.

ešení praktických

programátorských úloh

Zdrojové soubory ke knizezonerpress.cz/download/C_4_0_reseni_praktickych_uloh.zip

ZONER software, a.s., Nové sady 18, 602 00 Brno

Zoner Presstel.: 532 190 883e-mail: [email protected]