home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 October / Chip_2000-10_cd1.bin / obsahy / Chip_txt / TXT / 162-165.TXT < prev    next >
Text File  |  2000-08-31  |  9KB  |  118 lines

  1. Jazyk C#
  2. O p∙l t≤nu v²Ü
  3. Po definitivnφm rozchodu s Javou firmy Sun Microsystems p°ichßzφ Microsoft s nßvrhem novΘho programovacφho jazyka. Jeho nßzev C#, Φten² jako C sharp,  snad v angliΦtin∞ m∙₧e znamenat cosi jako "chytrΘ C", auto°i si vÜak p°itom neodpustili slovnφ h°φΦku û anglosask² hudebnφk si pod tφmto oznaΦenφm p°edstavφ jedinΘ: t≤n cis.
  4.  
  5. V souΦasnΘ dob∞ je k dispozici prvnφ, jeÜt∞ ne zcela ·plnß referenΦnφ p°φruΦka C#. U₧ z nφ je vÜak z°ejmΘ, ₧e nov² jazyk obsahuje n∞kterΘ velice zajφmavΘ rysy a vlastnosti, a proto se zde pokusφm alespo≥ o krßtkou exkurzi do jeho syntaxe a sΘmantiky. Znovu p°ipomφnßm, ₧e nßsledujφcφ odstavce vznikly na zßklad∞ velice ranΘ verze referenΦnφ p°φruΦky, a tak se n∞kterΘ detaily jeÜt∞ mohou v budoucnosti zm∞nit.
  6.  
  7. Jako Javaà
  8. P°i ·pln∞ prvnφm pohledu nßs napadne, ₧e jazyk se znaΦn∞ podobß Jav∞. Nap°φklad tradiΦnφ "pozdrav sv∞tu" vypadß v C# takto:
  9. using System;
  10. class Hello {
  11.     static void Main() {
  12.         Console.WriteLine("Hello, world");
  13.     }
  14. }
  15. C# je stejn∞ jako Java zalo₧en na syntaxi jazyka C; nalezneme zde obvyklΘ t°φdy, rozhranφ a metody, sprßva pam∞ti je stejn∞ jako v Jav∞ zalo₧ena na garbage collectoru. Tento fakt vedl k mnoh²m komentß°∙m o tom, ₧e C# je tupß a nekompatibilnφ nßpodoba Javy, kterou Microsoft vymyslel jenom proto, aby odvrßtil zßjem v²vojß°∙ od Sunu. Pokud se ovÜem do normy zaΦteme podrobn∞ji, zjistφme dosti podstatnΘ rozdφly, kterΘ v∞tÜinou vyznφvajφ ve prosp∞ch C#.
  16.  
  17. Hodnoty a odkazy
  18. C# rozliÜuje dv∞ zßkladnφ skupiny typ∙ û typy hodnotovΘ a referenΦnφ. Prom∞nnΘ hodnotov²ch typ∙ p°φmo obsahujφ svß data, zatφmco prom∞nnΘ odkazov²ch typ∙ obsahujφ odkaz na data ulo₧enß jinde. OdkazovΘ typy jsou tedy p°edevÜφm t°φdy a rozhranφ a dßle takΘ pole a tzv. zßstupci (delegate), co₧ jsou vφcemΘn∞ odkazy na metody. Mezi hodnotovΘ typy pat°φ zßkladnφ typy, zßznamy (struct) a v²Φty (enum).
  19. Rozdφl mezi odkazov²mi a hodnotov²mi typy ilustruje nßsledujφcφ p°φklad:
  20. class Class1 {
  21.     public int Value = 0;
  22. }
  23.     ...
  24.     int val1 = 0;
  25.     int val2 = val1;
  26.     val2 = 123;
  27.     Class1 ref1 = new Class1();
  28.     Class1 ref2 = ref1;
  29.     ref2.Value = 123;
  30. ...
  31. Po skonΦenφ tohoto progrßmku bude val1 obsahovat 0, zatφmco v ref1.Value bude 123.
  32.  
  33. T°φdy a zßznamy
  34. C# mß jeden velice pragmatick² rys û krom∞ t°φd (class), kterΘ jsou referenΦnφmi typy, obsahuje takΘ zßznamy (struct), co₧ jsou typy hodnotovΘ. Zßznamy p°itom mohou obsahovat metody, dokonce mohou implementovat rozhranφ; jedinΘ omezenφ pro n∞ spoΦφvß v tom, ₧e se nemohou stßt Φlenem typovΘ hierarchie.
  35. C# podporuje p°et∞₧ovßnφ operßtor∙ (na rozdφl od Javy), a tak je v principu mo₧nΘ nadefinovat nap°φklad plnohodnotn² typ komplexnφch Φφsel, jejich₧ pou₧itφ bude k nerozeznßnφ od pou₧itφ zßkladnφho typu int. Ve skuteΦnosti se zßkladnφ typy liÜφ od takto nadefinovan²ch nov²ch typ∙ pouze p°φmou podporou pro p°ekladaΦ, a tedy efektivn∞jÜφm vygenerovan²m k≤dem.
  36.  
  37. Sjednocenφ typ∙
  38. V²znamnou vlastnostφ C# je tzv. sjednocenφ typ∙. Libovoln² typ lze, bez ohledu na to, zda je hodnotov², nebo odkazov², p°evΘst na t°φdu object a zp∞t:
  39. int i = 777;
  40. object o = i;
  41. int j = (int) o;
  42. Zp∞tn² p°evod se pochopiteln∞ provede pouze v p°φpad∞, ₧e prom∞nnß typu object obsahuje hodnotu (nebo odkaz v p°φpad∞, ₧e byl p°i°azen referenΦnφ typ) po₧adovanΘho typu (jinak dojde k v²jimce).
  43. P°evodu hodnotovΘho typu na objekt sΘmanticky odpovφdß vytvo°enφ novΘ instance t°φdy, kterß obsahuje jedin² atribut po₧adovanΘho typu a p°i°azenφ hodnoty do tohoto atributu. Schopnost pracovat s hodnotov²mi typy jako s objekty tak vypl≥uje mezeru, kterß existuje ve v∞tÜin∞ objektov∞ orientovan²ch jazyk∙, jako je Java nebo Objective C. Nap°φklad kontejnerovΘ typy (pole, z°et∞zenΘ seznamy apod.) staΦφ implementovat pro instance t°φdy object, a p°itom je lze bez dalÜφho ·silφ pou₧φvat pro skladovßnφ zßkladnφch typ∙ nebo zßznam∙.
  44.  
  45. Zßstupci
  46. Datov² typ zßstupce (delegate) p°ibli₧n∞ odpovφdß ukazateli na funkci, ovÜem mφsto funkce ukazuje na metodu urΦitΘ konkrΘtnφ instance. Deklarace datovΘho typu zßstupce urΦuje poΦet a typ parametr∙ a typ nßvratovΘ hodnoty:
  47. delegate void ZpracujInt(int i);
  48. Do prom∞nnΘ takto definovanΘho typu ZpracujInt lze p°i°adit libovolnou metodu, kterß mß jedin² parametr int a nic nevracφ. Zßstupce tak vlastn∞ p°edstavuje zapouzd°enφ volatelnΘ entity, co₧ je mimo jinΘ ideßlnφm zßkladem pro implementaci zpracovßnφ udßlostφ v GUI.
  49. Mimochodem, jazyk Java °eÜφ tuto oblast pomocφ pon∞kud kostrbatΘho systΘmu vnit°nφch a anonymnφch t°φd. Zßstupci byli jednφm z rozÜφ°enφ J++ Microsoftu oproti Jav∞, se kter²mi Sun ost°e nesouhlasil, co₧ nakonec vedlo k soudnφmu sporu a opuÜt∞nφ Javy Microsoftem. Nevφm, mn∞ osobn∞ se zßstupci zdajφ jednoduÜÜφ a p°ehledn∞jÜφ.
  50.  
  51. Vlastnosti a indexy
  52. Vlastnosti (property) p°edstavujφ mechanismus dob°e znßm² z Visual Basicu, kter² volßnφ metod "maskuje" jako p°i°azenφ atributu. Nap°φklad
  53. public class Button {
  54.     private string caption;
  55.     public string Caption {
  56.         get { return caption; }
  57.         set {    caption = value; Repaint(); }
  58.     }
  59. ...
  60. }
  61. definuje vlastnost Caption. 
  62. P°i°azenφm
  63. Button b = new Button();
  64. b.Caption = "ABC";    // set
  65. string s = b.Caption;    // get
  66. b.Caption += "DEF";    // get & set
  67. se volajφ p°φsluÜnΘ metody get a set.
  68. Jin² mechanismus dokß₧e zajistit, aby se objekt choval jako "chytrΘ pole":
  69. public class List {
  70.     private string[] items;
  71.     public string this[int index] {
  72.         get { return items[index]; }
  73.         set {
  74.             items[index] = value;
  75.             Repaint();
  76.         }
  77.     }
  78.     ...
  79. }
  80.  
  81. List list;
  82. list[0] = "hello";
  83. TakovΘ °eÜenφ je v²hodnΘ dokonce i oproti jinak velmi otev°enΘmu systΘmu p°et∞₧ovßnφ operßtor∙ v C++, kde n∞kdy b²vß problΘm s rozliÜenφm zßpisu do "pole" a Φtenφ z "pole".
  84.  
  85. NebezpeΦnß z≤na
  86. AΦkoliv se C#, stejn∞ jako Java, v∞tÜinou celkem rozumn∞ tvß°φ jako jazyk pom∞rn∞ vysokΘ ·rovn∞, kter² neumo₧≥uje nap°φklad p°φmo pracovat s obsahem pam∞ti, na rozdφl od Javy autory neopustil pragmatick² duch a zavedli jakousi "nebezpeΦnou z≤nu", tedy kus k≤du, ve kterΘm existujφ ukazatelΘ jako v C a v n∞m₧ se smφ cokoliv û t°eba tohle:
  87. class Dirty {
  88.     unsafe static void Set(byte[] dst, byte val, int count) {
  89.     fixed (byte *d = dst)
  90. while(count --> 0)
  91. *d++ = val;
  92.     }
  93. }
  94. V²hodou je, ₧e takovΘto "divokΘ" Φßsti k≤du jsou klφΦov²m slovem unsafe dob°e izolovßny od ostatnφho "mφrumilovnΘho" okolφ.
  95.  
  96. DalÜφ zajφmavΘ vlastnosti
  97. - C# obsahuje vφcemΘn∞ klasick² cΘΦkov² preprocesor. To je dalÜφ d∙kaz zdravΘho rozumu autor∙, proto₧e i kdy₧ nejsou v C# pot°eba hlaviΦkovΘ soubory pro vyjßd°enφ rozhranφ mezi moduly, stßle je jeÜt∞ hodn∞ situacφ, kterΘ se bez preprocesoru °eÜφ zbyteΦn∞ slo₧it∞.
  98. - Krom∞ klasickΘ °φdicφ struktury, vesm∞s p°evzatΘ z C, je k dispozici p°φkaz foreach, kter² docela p∞kn²m zp∙sobem zobec≥uje prochßzenφ mezi prvky kontejner∙. 
  99. - C# se na rozdφl od Javy nebrßnφ dokonce ani zprofanovanΘmu goto.
  100. - Pro synchronizaci proces∙ lze pou₧φt klφΦovΘ slovo lock.
  101. - KlφΦov²mi slovy checked a unchecked lze stanovit, zda se mß kontrolovat aritmetickΘ p°eteΦenφ v²razu.
  102. - Auto°i nezapomn∞li ani na v²ΦtovΘ typy (enum), jejich₧ absence v javovskΘm repertoßru n∞kdy vadφ.
  103.  
  104. Souvislosti
  105. AΦkoliv se o tom referenΦnφ p°φruΦka p°φliÜ neÜφ°φ, je evidentnφ, ₧e jazyk C# je vytvo°en tak, aby "zapadl" do celkovΘ strategie Microsoftu, zejmΘna v souvislosti s novou platformou .NET.
  106. A tak je nap°φklad z°ejmΘ, ₧e rozhranφ (interface) v C# p°φmo korespondujφ s rozhranφmi COM, tak₧e ka₧d² objekt v C# m∙₧e b²t vlastn∞ automaticky COM objektem.
  107. V souvislosti s oznßmenφm C# byl uveden takΘ nov² formßt CEF, nezßvisl² na procesoru. Jednß se tedy o jakousi obdobu Java Bytecode, ovÜem na rozdφl od n∞j je tento formßt pln∞ pou₧iteln² i pro jinΘ jazyky (Visual Basic, C++, Pascal) a od poΦßtku je urΦen pro p°eklad do strojovΘho k≤du, nikoliv pro interpretovßnφ.
  108.  
  109. Zßv∞r
  110. Jazyk C# je na jednΘ stran∞ nepochybn∞ protitahem Microsoftu na nßstup Javy. Jeho auto°i m∞li jist∞ v²hodu v tom, ₧e za p∞t let existence Javy mohli nasbφrat praktickΘ zkuÜenosti s programovacφm jazykem takovΘho typu. P°i bli₧Üφm prozkoumßnφ se C# jevφ jako jazyk podstatn∞ flexibiln∞jÜφ a pragmatiΦt∞jÜφ a prßce v n∞m bude s velkou pravd∞podobnostφ pohodln∞jÜφ ne₧ v Jav∞. P°ipoΦteme-li ·zkou integraci s dominantnφm objektov²m systΘmem (a tady mßm na mysli spφÜ COM ne₧ samotnΘ Windows), je pravd∞podobnΘ, ₧e C# mß sluÜnou Üanci stßt se v dohlednΘ dob∞ jednφm z nejrozÜφ°en∞jÜφch programovacφch jazyk∙.
  111. Miroslav Fφdler (cxl@volny.cz)
  112. (Ing. Miroslav Fφdler je programßtorem u firmy Cybex Development, s. r. o.)
  113.  9/00: 936-CSHARP (Au.Fφdler - 4.75 n.str., 1900.22 KΦ) Strana: 4
  114.  
  115.     Chyba! Neznßm² argument p°epφnaΦe./1
  116.  
  117.  
  118.