Já bych C# až tolik nepřechvaloval. Je to celkem dobře navržené, ale vadí mi pár detailů: syntaktická omáčka ve stylu C++ okolo překrývání/implementace zděděných funkcí, klíčová slova ref a out, vlákno není třída a delegáti, mizerné nástroje(na to jak je to moderní jazyk). Ta první připomínka je vyloženě detail. Zato ref a out svádí k psaní prasáren typu návratová hodnota v parametru funkce atd. To chápu v C, kde to často jinak nejde, ale v C# jsou na to jiné prostředky. Že vlákno není třída se občas může hodit, ale znamená to patlat se s běžnějším použitím vláken. Podle mě je lepší hackovat speciální případy než ty běžné. Co se mi naopak líbí je řešení getrů a setrů.
Taktéž nevidím problém s generiky, fungují tak jak se očekává, šablony v C++ jsou na tom daleko hůře, s javou nesrovnávám, javu detailně neznám.
co se týče klíčových slov ref a out, je jedině dobře, že víte, že ten kód tu hodnotu co mu tam pošlete referencí (v C++ pomocí &, v C# implicitně) prostě nezmění. Fuj kód v C++ nebo i argument přez pointer v C mohl s cílem udělat cokoliv a to dokonce i když se tam objevilo magické slovo const. Netvrdím, že v C# nejde psát fuj kód, ten jde psát ve všem, ale jsem přesvědčen že ref a out jsou pro čtení kódu opravdu přínosem.
To je asi vec nazoru, ale myslim ze delegat je na svoj ucel navrhnuty dobre – ak potrebujem jednoduchy (a aj asynchronny) callback nemusim sa patlat z celym observerom ale pouzijem to. Interface s jednou metodou mozes pouzit samozrejme tiez.
Ak potrebujes samostatnu jednoduchu funkciu da sa tusim od 2.0 pouzit anonymny delegat takze ti to vygeneruje kompilator.
C# ma svoje muchy, ale IMHO riesi 95% aktualny a standardnych situacii (desktop, weboviny, databazovy pristup) zo sucasnych jazykov asi najlepsie.
Popravdě, neexistenci out parametrů považuji za zdaleka největší nevýhodu Javy. Zaplevelovat kód jednoúčelovými třídami, kdykoli člověk potřebuje předat ven více dat, je fakt humus :-/
Ad delegáti: Nejsem si teď jistý, jestli je to přesně to co si pod tím vybavuji, ale mně přišla jako největší výhoda automatická správa callbacků. Nemusím psát pro každý callback extra set na držení callbacků, add funkci, remove funkci a iteraci přes set.
Ve skutečnosti není důvod, proč by metoda nemohla vracet více hodnot. To by se ale návrháři jazyka museli rozhlédnout více po jiných jazycích (např. objevit n-tice a naučit se je rozbalovat). Výstupní proměnné považuju za anachronismus a výzvu k tomu, aby člověk psal nepřehledný kód. To platí i o Go, které volitelně používá pojmenované návratové proměnné.
O něco přehlednější je místo takových „ad hoc tříd“ používat pole o jednom prvku, které se předá jako parametr a vevnitř funkce se do něj nastaví „návratová hodnota“. Pokud se přitom dodržují nějaké konvence (třeba že název takového parametru má suffix „Ref“), dá se to ustát a ani to moc nebolí…
S tímhle naprosto souhlasím. Když jsem se poprvé setkal s Javou, tak jsem dobrou hodinu hledal jak vrátit hodnotu přes parametr než jsem s hrůzou zjisil, že to opravdu nejde.
Zlaté C/C++, je pravda, že se člověk musí držet, aby nepsal prasárny, ale když je něco zapotřebí, tak mu aspoň tvůrci nestaví do cesty umělá omezení.
Další věc, kterou bych asi nepřekous je neexistence preprocesoru, který se v některých věcech neuvěřitelně hodí – hlavně minimalizace opakování stejného kódu v případech, kdy to jinak nejde. I když chápu, že includování hlavičkových souborů s ním není vždy nejštastnější.
Pokial sa dobre pamatam tak ref a out su tam hlavne kvoli kompatibilite s COM a ATL modelmi plus aby sa dali vyuzivat cez P/Invoke nativne Win32/64 volania do OS.
Je to proste pomocka na kompatibilitu (podobne ako unsafe mod, IntPtr, vypinanie array-checku) atd. a pokial viem tak ani MS to okrem specialnych pripadov moc nepodporuje. Kazdopadne sa pracuje na nativnej podpore Tuples ktore by mali byt coskoro v 4.0 takze sme zase o krok blizie.
V programování přeci jen nejde jen o rychlost psaní kódu – ta syntaktická omáčka v C# zpřehledňuje kód, víme hned zda je metoda virtuální, nebo přepsaná nevirtuální (new) atd.
event a delegate si dovolím tvrdit, že jsou naopak velmi dobrým řešením.
Co se týká multivláknového programování – podpora pro vícevláknové for, parallel LINQ atd. – opět na špici mezi nástroji.
Ref a out jsou často kritizovány, ale někdy se hodí – nikdo nenutí tyto konstrukce nadužívat – mimochodem, v 4.0 je zaveden Tuple pro případ takového rychlého navrácení více hodnot.