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.
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.
Jako Javaà
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:
using System;
class Hello {
static void Main() {
Console.WriteLine("Hello, world");
}
}
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#.
Hodnoty a odkazy
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).
Rozdφl mezi odkazov²mi a hodnotov²mi typy ilustruje nßsledujφcφ p°φklad:
class Class1 {
public int Value = 0;
}
...
int val1 = 0;
int val2 = val1;
val2 = 123;
Class1 ref1 = new Class1();
Class1 ref2 = ref1;
ref2.Value = 123;
...
Po skonΦenφ tohoto progrßmku bude val1 obsahovat 0, zatφmco v ref1.Value bude 123.
T°φdy a zßznamy
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.
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.
Sjednocenφ typ∙
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:
int i = 777;
object o = i;
int j = (int) o;
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).
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∙.
Zßstupci
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:
delegate void ZpracujInt(int i);
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.
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Üφ.
Vlastnosti a indexy
Vlastnosti (property) p°edstavujφ mechanismus dob°e znßm² z Visual Basicu, kter² volßnφ metod "maskuje" jako p°i°azenφ atributu. Nap°φklad
public class Button {
private string caption;
public string Caption {
get { return caption; }
set { caption = value; Repaint(); }
}
...
}
definuje vlastnost Caption.
P°i°azenφm
Button b = new Button();
b.Caption = "ABC"; // set
string s = b.Caption; // get
b.Caption += "DEF"; // get & set
se volajφ p°φsluÜnΘ metody get a set.
Jin² mechanismus dokß₧e zajistit, aby se objekt choval jako "chytrΘ pole":
public class List {
private string[] items;
public string this[int index] {
get { return items[index]; }
set {
items[index] = value;
Repaint();
}
}
...
}
List list;
list[0] = "hello";
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".
NebezpeΦnß z≤na
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:
class Dirty {
unsafe static void Set(byte[] dst, byte val, int count) {
fixed (byte *d = dst)
while(count --> 0)
*d++ = val;
}
}
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φ.
DalÜφ zajφmavΘ vlastnosti
- 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∞.
- 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∙.
- C# se na rozdφl od Javy nebrßnφ dokonce ani zprofanovanΘmu goto.
- Pro synchronizaci proces∙ lze pou₧φt klφΦovΘ slovo lock.
- KlφΦov²mi slovy checked a unchecked lze stanovit, zda se mß kontrolovat aritmetickΘ p°eteΦenφ v²razu.
- Auto°i nezapomn∞li ani na v²ΦtovΘ typy (enum), jejich₧ absence v javovskΘm repertoßru n∞kdy vadφ.
Souvislosti
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.
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.
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φ.
Zßv∞r
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∙.
Miroslav Fφdler (cxl@volny.cz)
(Ing. Miroslav Fφdler je programßtorem u firmy Cybex Development, s. r. o.)