1. díl - Úvod do C# a .NET frameworku

C# .NET Základní konstrukce Úvod do C# a .NET frameworku American English version English version

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Vítejte u prvního dílu seriálu o C#, který vám odhalí jazyk C# i framework .NET. Budeme se učit postupně, od úplných začátků až po složité konstrukce, objektové modely a např. práci s databází nebo webové aplikace. S trochou trpělivosti a vytrvalosti se z tebe tak stane dobrý programátor.

Abychom plně porouzuměli jazyku C#, ohlédněme se do minulosti na to, jak se programovací jazyky vyvíjely. Bude pro nás totiž důležité pochopit, jak C# pracuje a proč je dobré programovat právě v něm.

Vývoj programovacích jazyků

1. generace jazyků - Strojový kód

Procesor počítače umí vykonávat jen omezené množství jednoduchých instrukcí, které jsou uloženy jako sekvence bitů, jsou to tedy čísla. Ta se mu obvykle zadávají v hexadecimální (šestnáctkové) soustavě. Instrukce jsou tak elementární, že umožňují pouze např. sčítání adres nebo skoky mezi instrukcemi. Nelze např. jednoduše sečíst dvě čísla, musíme se na čísla dívat jako na adresy v paměti a takové sečtení čísel zabere několik instrukcí. Program sčítající dvě čísla by vypadal např. takto:

2104
1105
3106
7001
0053
FFFE
0000

Instrukce se procesoru předloží v binární podobě. Takovýto kód je samozřejmě extrémně nečitelný a závisí na instrukční sadě daného CPU. Určitě v tomto jazyce nebude jednoduché tvořit nějaké programy, bohužel každý program musí být nakonec do tohoto jazyka přeložen, aby mohl být na procesoru počítače spuštěn.

Strojový kód

2. generace jazyků - Assembler

Assembler (zkráceně ASM) není o nic jednodušší, než strojový kód, ale je lidsky čitelný. Jedná se o strojový kód, ve kterém mají instrukce slovní označení (kód), čili si člověk nemusí pamatovat čísla. Kódy instrukcí se poté přeloží na výše uvedený strojový kód. Stejný program by v ASM vypadal takto:

ORG 100
LDA A
ADD B
STA C
HLT
DEC 83
DEC –2
DEC 0
END

Vidíme, že je to poněkud lidštější, ale stále nezasvěcení lidé vůbec netuší, jak program funguje (včetně mne).

3. generace jazyků

Jazyky v třetí generaci konečne nabízí uživateli určitou abstrakci nad tím, jak program vidí počítač, zaměřují se na to, jak program vidí člověk. Naše čísla jsou vnímána již jako proměnné, zdrojový kód připomíná matematický zápis.

Sečtení dvou čísel by v jazyce C vypadalo takto:

int main(void)
{
        int a, b, c;
        a = 83;
        b = -2;
        c = a + b;
        return 0;
}

Všichni asi tušíme, co program dělá, sečte čísla 83 a -2 a výsledek uloží do proměnné c. U všech jazyků třetí generace je samozřejmě výhodou vysoká čitelnost. S dalším vývojem šly jazyky ještě dál a přinesly objektově orientované programování, ale o tom až později. Jazyky v třetí generaci spadají v zásadě do třech kategorií:

Kompilované jazyky

Kompilované (neřízené) jazyky mají tedy svůj zdrojový kód v jazyce, kterému lidé dobře rozumí. Tento zdrojový kód se samozřejmě musí přeložit do strojového kódu, aby ho bylo možné na procesoru spustit. Tento překlad zajišťuje překladač (kompiler), který přeloží najednou celý program do stroj. kódu.

Kompiler

Kompilace má tyto výhody:

  • Rychlost - Jediné zbrždění spočívá v jednorázové kompilaci, přeložený program poté běží srovnatelně rychle, jako kdyby byl napsán např. v ASM.
  • Nepřístupnost zdroj. kódu - Program se šíří již zkompilovaný, není jej možné jednoduše modifikovat pokud zároveň nevlastníte jeho zdroj. kód.
  • Snadné odhalení chyb ve zdroj. kódu - Pokud zdrojový kód obsahuje chybu, celý proces kompilace spadne a programátor je s chybou seznámen. To značně zjednodušuje vývoj.

Dále jsou tu samozřejmě nevýhody:

  • Závislost na platformě - Program je stále závislý na platformě, tedy na typu procesoru a operačním systému. Zkompilovaný program nemůžeme vzít a přenést na jinou platformu bez toho, aby byl na této platformě zkompilován.
  • Nemožnost editace - Jakmile se program jednou zkompiluje do strojového kódu, nelze ho editovat jinak, než opětovnou kompilací. To pochopitelně platí i pro výše zmíněné jazyky.
  • Memory management - Vzhledem k tomu, že počítač danému programu nerozumí a jen mechanicky vykonává instrukce, můžeme se někdy setkat s velmi nepříjemnými chybami s přetečením paměti. Kompilované jazyky obvykle nemají automatickou správu paměti a jsou to jazyky nižší (s nižším komfortem pro programátora). Běhové chyby způsobené zejména špatnou správou paměti se kompilací neodhalí.

Příkladem kompilovaných jazyků jsou např. jazyk C, jeho objektový následník C++ nebo Pascal/Delphi.

Interpretované jazyky

Interpretace se snaží řešit problém přenositelnosti programů mezi různými platformami a také přichází s vyšším komfortem pro programátora. Interpret funguje podobně, jako kompiler, jen nepřekládá program celý najednou, ale překládá pouze to, co je v danou chvíli potřeba. (Interpreter znamená v angličtině tlumočník, tedy nejprve vyslechne jednu větu mluvčího a tu poté přeloží a vysloví. Překlad probíhá během proslovu, tedy běhu programu, po větách/instrukcích. Kompiler/překladač přeloží rozhovor celý najednou a poté ho celý přečte.). Můžeme si představit, že výše uvedený zdrojový kód by interpret četl po jednotlivých řádcích, tu část by vždy zkompiloval do strojového kódu a vykonal. Výsledek kompilace by zahodil a přesunul by se na další řádek. Možná vám to připadá jako plýtvání výkonem procesoru a je pravda, že tento způsob běhu programu také není zrovna nejrychlejší.

Interpret

Jaké může mít tedy tento postup výhody? Je jich hned několik:

  • Přenositelnost: Program je plně přenositelný, pokud existuje interpret pro danou platformu, půjde tam zdrojový kód programu spustit (a vývoj interpretu je snažší, než vývoj kompilátoru).
  • Jednodušší vývoj - Ve vyšších jazycích jsme odstíněni od správy paměti, kterou za nás dělá tzv. garbage collector (řekneme si o něm v seriálu více). Často také nemusíme ani zadávat datové typy a máme k dispozici vysoce komfortní kolekce a další struktury.
  • Stabilita - Díky tomu, že interpret kódu rozumí, předejde chybám, které by zkompilovaný program jinak klidně vykonal. Běh interpretovaných programů je tedy určitě bezpečnější, dále umožňuje zajímavou vlastnost, tzv. reflexi, kdy program za běhu zkoumá sám sebe, ale o tom později.
  • Jednoduchá editace - Program můžeme vyvíjet po částech a nahrávat na cílové umístění, díky tomu, že se nemusí kompilovat, ho je možné jednoduše editovat "za běhu".

Interpret má tři zásadní nevýhody:

  • Rychlost - Interpretace může být mnohdy velmi pomalá a program tak plně nevyužívá výkon počítače.
  • Často obtížné hledání chyb - Díky kompilaci za běhu se chyby v kódu objeví až v tu chvíli, kdy je kód spuštěn. To může být někdy velmi nepříjemné.
  • Zranitelnost - Protože se program šíří v podobě zdrojového kódu, každý do něj může zasahovat nebo krást jeho části.

Příkladem interpretovaného jazyka je např. PHP. Na většině webů ten poměrně pohodlný jazyk výkonově stačí, ale například Facebook používá speciální kompilovanou verzi PHP, zájemci ať se podívají na projekt HipHop for PHP.

Jazyky s virtuálním strojem

Napadlo vás, co by se stalo, kdyby se oba dva výše zmíněné způsoby spojily? Pokud ano, gratuluji, vynalezli jste virtuální stroj. Jedná se o nejmodernější podobu jazyka, která je v současné době také nejrozšířenější a nejlepší volbou pro vývoj většiny aplikací. Nebudu tajit, že do této kategorie spadá samotný C# nebo Java.

Zdrojový kód je nejprve přeložen do tzv. mezikódu, kterému Microsoft říká CIL (Common Intermediate Language). Jedná se v podstatě o strojový (binární) kód, který má ale o poznání jednodušší instrukční sadu a přímo podporuje objektové programování. Tento mezikód je potom díky jednoduchosti relativně rychle interpretovatelný tzv. virtuálním strojem (tedy interpretem, v případě .NET je to tzv. CLR - Common Language Runtime). Výsledkem je strojový kód pro náš procesor.

Virtuální stroj

Určitě jste trochu vyděšeni, ale věřte, že jsme v podstatě odstranili nevýhody interpreta i kompileru a můžeme využívat mnohé z jejich výhod:

  • Odhalení chyb ve zdrojovém kódu - Díky kompilaci do CIL jednoduše odhalíme chyby ve zdrojovém kódu.
  • Stabilita - Díky tomu, že interpret kódu rozumí, zastaví nás před vykonáním nebezpečné operace a na chybu upozorní. Můžeme také provádět reflexi (i když pro CIL, ale od toho jsme většinou odstíněni).
  • Jednoduchý vývoj - Máme k dispozici hitech datové struktury a knihovny, správu paměti za nás provádí garbage collector.
  • Slušná rychlost - Rychlost se u virtuálního stroje pohybuje mezi interpretem a kompilerem. Virtuální stroj již výsledky své práce po použití nezahazuje, ale dokáže je cachovat, sám se tedy optimalizuje při četnějších výpočtech a může dosahovat až rychlosti kompileru (Just In time Compilator). Start programu bývá pomalejší, protože stroj překládá společně využívané knihovny.
  • Málo zranitelný kód - Aplikace se šíří jako zdrojový kód v CIL, není tedy úplně jednoduše lidsky čitelná.
  • Přenositelnost - Asi je jasné, že hotový program poběží na každém železe, na kterém se nachází virtuální stroj. To ale není vše, my jsme dokonce nezávislí i na samotném jazyce. Na jednom projektu může dělat více lidí, jeden v C#, druhý ve Visual Basic a třetí v C++. Zdrojové kódy se poté vždy přeloží do CILu.

Jazyky s virtuálním strojem ctí objektově orientované programování a jedná se o současný vrchol vývoje v této oblasti. Existují i jazyky 4. a 5. generace, ale ty mají specifické použití a nebudeme se s nimi zde zatím zabývat.

.NET framework

Jak funguje C# jsme si tedy vysvětlili, ještě si řekněme, co je přesně .NET framework. Rozumí se jím v zásadě čtyři věci: jazyk, Visual Studio, Virtuální stroj (CLR) a knihovny

Jazyk

Jak již jsem se zmínil, v .NET máme k dispozici několik jazyků, ve kterých můžeme vyvíjet. C# je z nich nejmodernější a byl přizpůsoben právě pro .NET.

Visual Studio

Visual Studio je IDE (Integrated Development Environment), prostředí, ve kterém píšeme zdrojový kód a které nám také pomáhá s vývojem. VS je velmi uznávané i v řadách javistů, jedná se o moderní IDE, které je ve verzi Express poskytováno zdarma a to i pro komerční účely.

Virtuální stroj

CLR je virtuální stroj, který interpretuje CIL do instrukcí fyzického procesoru.

Knihovny

Knihovny jsou asi největší výhodou .NETu. Microsoft nám v podstatě dodává kompletní sadu knihoven, ve které máme předpřipravenou řadu struktur a komponent, např. pro práci s konzolí, databázemi, formulářovými prvky a podobně. Řešení jsou kvalitní a aktuální, jsou sdílené mezi jednotlivými jazyky. Jelikož MS je autorem i Windows, jejich komponenty hezky pasují a jsou pro jejich systém odladěné. Pro běh aplikací je potom nutné, aby na koncové stanici byla ta samá verze .NETu, ve které byla aplikace vyvinuta. Dobrá zpráva je, že Windows mají vždy nějaký .NET v sobě.

.NET má následující strukturu:

.NET framework struktura

V .NET 2.0 vidíme samotný CLR (virtuální stroj) a základní knihovnu Base Class Library. Verze 3.0 přináší určité nové směry ve vývoji formulářových aplikací a procesů. Zajímavá pro nás bude zejména verze 3.5, která přinesla tzv. dotazovací jazyk LINQ, o něm si řekneme více později. Další verze umožňuje efektivně provozovat LINQ na vícejádrových procesorech. V roce 2012 pak ještě přibyla verze 4.5, ta např. zjednodušuje psaní asynchronních funkcí (o tom později).

Nyní víme, s čím to vlastně budeme pracovat. V příští lekci, Visual Studio a první konzolová aplikace, si ukážeme práci s Visual Studiem a vytvoříme si svůj první program.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
125 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (8)

 

 

Komentáře

Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Drahomír Hanák:10.5.2012 23:59

Tak tohle je velmi dobře sepsaný úvod a to nejen do C#. Tento základ by měl znát snad každý programátor. Sám jsem se v článku dozvěděl věci, které jsem ještě zcela nechápal nebo vůbec nevěděl. Navíc je to napsané hezky srozumitelně i pro úplné začátečníky. Děkuji za něj, určitě se bude líbit víc lidem.

Sice osobně víc preferuji Javu (hlavně kvůli vývoji pro Android, učím se s GWT apod.), ale C# je velmi pěkný jazyk. Navíc disponuje Visual Studiem, což je zatím nejlepší IDE, ve kterém jsem kdy pracoval. Eclipse takové možnosti jako VS nemá. Také se mi v hodně líbí WPF nebo XNA framework.

 
Odpovědět  +7 10.5.2012 23:59
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Drahomír Hanák
David Čápka:11.5.2012 7:50

Ahoj, díky :) Záměrně jsem chtěl vysvětlit jak virt. stroj funguje, protože je důležité vědět, v čem to vlastně začínáme programovat. Je to první díl z asi 35. dílného seriálu o C#, něco podobného tu potom bude i pro Javu :)

Odpovědět  +2 11.5.2012 7:50
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:7.9.2012 19:22

Zajímavý článek. ;)

Odpovědět 7.9.2012 19:22
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Mediel
Redaktor
Avatar
Mediel:13.9.2012 15:18

Každopádně velmi poučné, určitě tuto síť budu prezentovat všem svým přátelům :)

Odpovědět 13.9.2012 15:18
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Vladimír Škopek
Neregistrovaný
Avatar
Vladimír Škopek:16.2.2013 10:35

skutečně perfektně,přehledně a srozumitelně napsané stránky:)

 
Odpovědět 16.2.2013 10:35
Avatar
milan.menousek:23.2.2013 16:57

pěkně napsaný a srozumitelný úvod do C#

 
Odpovědět 23.2.2013 16:57
Avatar
lastp
Redaktor
Avatar
lastp:2.4.2013 15:16

V článku je napsáno, že CLR je virtuální stroj, který interpretuje CIL, což není pravda. Už od první verze .Net Framework funguje tak, že CIL se vždycky kompiluje. To je zásadní rozdíl oproti Javě. V Javě může být bytecode buď interpretován nebo optimalizován pomocí JIT. Ale .Net Framework se nikdy neinterpretuje (výjimkou je Micro Framework pro embedded systémy).
Některé instalátory dokonce dokáží celou aplikaci zkompilovat hned po instalaci pomocí nástroje Ngen.exe (Native Image Generator). V takovém případě je na disku uložen přímo strojový kód a aplikace se pak spouští mnohem rychleji.

 
Odpovědět 2.4.2013 15:16
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lastp
David Čápka:3.4.2013 15:32

Kdyby se CIL neinterpretoval, nebylo by možné provádět spoustu věcí, které C# umí, např. reflexi. Můžeš uvést zdroj?

Odpovědět 3.4.2013 15:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Peter
Neregistrovaný
Avatar
Peter:3.4.2013 17:20

Zdravim pani. Chcem sa len poďakovať za tieto stránky a tieto návody. Som studentom VS na odbore automatizacie robotov a programovanie sme mali jeden semester kde sme prebereali visual basic. Dosť ma to chytilo a preto som sa rozhodol naucit sa nieco nove. tento program ma zaujal asi najviac a preto sa ucim na zaklade vasich clankov. Chcem veeeelmi podakovať za vasu namahu a dufam ze sa casom dopracujem aspon do fázy kde si budem vedeť naprogramovať nejaky ten svoj pekny programik s peknym vzhladom. Takze dakujem este raz a tesim sa na vsetky dalsie clanky (som na lekci c 4 :D)

 
Odpovědět 3.4.2013 17:20
Avatar
lastp
Redaktor
Avatar
Odpovídá na David Čápka
lastp:3.4.2013 23:39

Ve Visual Studiu můžete dát breakpoint na jakýkoli řádek a pak si zobrazit disassembly (ctrl+alt+D). Protože program v .Netu není interpretován, v okně disassembly nikdy neuvidíte instrukce IL. Vždy se zobrazí přímo instrukce procesoru (obvykle x86 nebo x64). Když si na MSDN vyhledáte článek "Compiling MSIL to Native Code", tak v něm je velice stručně napsáno, že IL se před spuštěním musí zkompilovat do nativního kódu. Lepší je si koupit nějakou tištěnou knihu. Například v knize Proffesional ASP.NET (která má 1300 stran) je kromě jiného v jedné kapitole také vysvětleno, jak funguje CLR.

 
Odpovědět 3.4.2013 23:39
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lastp
David Čápka:16.4.2013 10:31

Tak samozřejmě, že CIL musí být před spuštěním zkompilován do strojového kódu, jak bychom ho jinak spustili? Mám pocit, že nejsi úplně obeznámen s principem interpreteru, který samozřejmě kód kompiluje, jen ne najednou, ale "on the fly".

Odpovědět 16.4.2013 10:31
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
lastp
Redaktor
Avatar
Odpovídá na David Čápka
lastp:19.4.2013 20:20

Právě proto, že jsem naprogramoval už tři interprety, mám trochu jinou představu o tom, jak funguje interpret. V článku je interpret popisován tak, jako by to bylo synonymum pro just-in-time kompilátor, což je matoucí. Mladší programátoři už možná považují JIT kompilaci za samozřejmost, ale stále existuje spousta programovacích jazyků, které jsou interpretované. Skriptovací jazyky lze spustit několika způsoby: 1) just-in-time kompilace, 2) interpretace mezikódu, 3) interpretace zdrojového kódu. Například javascript se v moderních prohlížečích spouští pomocí JIT, ale zastaralé prohlížeče (Internet Explorer 8 ) javascript překompilují do mezikódu, který pak pomalu interpretují. Žádný interpret nefunguje tak, že by generoval instrukce strojového kódu a po vykonání je zahazoval. Při interpretaci žádný strojový kód nevzniká. Na ilustračním obrázku u interpretovaných jazyků by měl být jen Zdrojový kód - Interpret - Procesor. Když je na obrázku navíc strojový kód, vypadá to, jako by interpret vytvářel strojový kód, který by závisel na vstupním zdrojovém kódu. Ve skutečnosti procesor vykonává stále dokola stejný neměnný kód interpretu.
Programovací jazyky kompilované do mezikódu/bytekódu lze také spustit několika způsoby: 1) kompilace po instalaci, 2) just-in-time kompilace, 3) interpretace mezikódu. Interpret má výhodu v tom, že je nezávislý na procesoru, zatímco JIT kompilátory pro .NET musejí být čtyři (x86, x64, IA64, ARM). Druhou výhodou interpretu je menší spotřeba paměti, proto se používá v .NET Micro Frameworku. V případě JIT kompilace je v paměti zároveň CIL a strojový kód. Interpret je také výhodné použít pro funkce, které se volají jen jednou nebo málo často. Takovou optimalizaci .NET nedělá, ale Java ano. Na ilustračním obrázku u jazyků s virtuálním strojem by bylo dobré znázornit obě možnosti. Mezi Mezikódem a Procesorem může být buď Interpret, a nebo tam může být JIT kompilátor a Strojový kód.

Editováno 19.4.2013 20:22
 
Odpovědět 19.4.2013 20:20
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lastp
David Čápka:19.4.2013 21:11

Výsledné EXE aplikace v C# obsahuje assembly s CILem, zkompilované není. Při spuštění se zkompilují sdílené knihovny, proto spuštění tak dlouho trvá. Další funkčnosti jsou zkompilovány v tu chvíli, kdy jsou potřeba (JIT). Toto je pro mně stále interpretace. Kompilaci vnímám jako úplné převedení zdrojáku na stroják. Máš pravdu, že s tím zahazováním výsledků je to špatně, zahodí se až po vypnutí aplikace. Nepochopil jsem rozdíl mezi interpretací mezikódu a JIT, jak jsi to myslel?

Odpovědět  +1 19.4.2013 21:11
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na David Čápka
Luboš Satik Běhounek:19.4.2013 22:00

JIT kompilace je pořád kompilace. Interpretace je když se nekompiluje vůbec.

Odpovědět 19.4.2013 22:00
:)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Luboš Satik Běhounek
David Čápka:20.4.2013 7:55

Jo takhle, už chápu. :) Nějak to tu upřesním.

Editováno 20.4.2013 8:15
Odpovědět 20.4.2013 7:55
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:20.4.2013 9:17

V podstatě se takto zpracovávají všechny EXE, akorát u těch z C/C++ je to mnohem jednodušší, protože v EXE jsou bloky kódu, které se naskládají do RAM. Přímo spustitelné programy už téměř vymizely.

Odpovědět 20.4.2013 9:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
lastp
Redaktor
Avatar
lastp:20.4.2013 12:01

Většina programovacích jazyků používá nějaký mezikód. U kompilovaných jazyků je možné kompilovat zdrojový kód přímo do strojového kódu, ale zpravidla to funguje tak, že jedna část kompilátoru zkompiluje zdrojový kód do mezikódu a druhá část zkompiluje mezikód do strojového kódu. Mezikód by klidně mohl vypadat úplně jako CIL, ale protože se neukládá na disk a nikdo ho nevidí, může kompilátor použít pro něj nejvýhodnější formát.
U interpretovaných jazyků je možné interpretovat přímo zdrojový kód, ale je to brutálně pomalé. V dávných dobách tak fungovaly interprety BASICu. Většinu času zabralo neustálé vyhledávání identifikátorů proměnných. Dnes se obvykle interpretované jazyky nejdříve zkompilují do mezikódu a potom se mezikód interpretuje. Protože se mezikód neukládá na disk a nikdo ho nevidí, může to být jakýkoli nedokumentovaný binární formát. Z pohledu uživatele to vypadá, jaky by interpret vykonával zdrojový kód.
Nejlépe to člověk pochopí, když se podívá do nějakého open source kompilátoru nebo interpretu. Například ve hře Enemy Territory používám GameMonkey skript. Ten se skládá z kompilátoru (využívá GNU Bison) a z virtuálního stroje (garbage collector, multi-threading). V hlavičkovém souboru jsou instrukční kódy deklarovány jako enum. Protože hlavičkový soubor je společný pro kompilátor i virtuální stroj, není důležité, jaké jsou číselné kódy instrukcí bytekódu. To je rozdíl oproti .NET, kde CIL musí být přesně specifikován. Také se můžete podívat na můj open source program Karel. U něj je zajímavé, že mezikód kromě běžných instrukcí (CALL, RET, JUMP, POP, ADD, CMP, ...) obsahuje také instrukce pro pohyb robota (KROK, VLEVO_VBOK, ...).

 
Odpovědět  +1 20.4.2013 12:01
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lastp
David Čápka:20.4.2013 13:44

Wow, koukám, že tomu opravdu rozumíš. Čili třeba PHPčko se kompiluje do mezikódu, který se interpretuje?

U toho VM to funguje přesně jak, když tedy kompiluje a neinterpretuje? Předpokládám, že při kompilace se vytvoří nějaký kontext, který si VM dále uchovává a podle kterého se dále řídí běh zkompilovaného programu, je to tak?

Jinak Karel mi tu běhá :D

Odpovědět 20.4.2013 13:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
lastp
Redaktor
Avatar
Odpovídá na David Čápka
lastp:22.4.2013 21:42

PHP skripty se také kompilují do mezikódu. Na vytížených serverech je vhodné mít nainstalováno cachování mezikódu, aby se kompilace neprováděla při každém načtení stránky.
Při kompilaci se kromě instrukcí vytvářejí ještě metadata, ale to závisí na konkrétním jazyce.

 
Odpovědět 22.4.2013 21:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na lastp
Kit:23.4.2013 9:16

To cachování mezikódu PHP umí například APM. Když jsem to přidal na produkčním serveru, výrazně se zvýšila propustnost aplikace. Utáhlo to mnohem víc klientů současně.

Odpovědět 23.4.2013 9:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:23.4.2013 9:23

VM interpretuje ten zkompilovaný mezikód. Java s tím v podstatě také začínala, ale pak do VM přidali ještě JIT kompilaci, která to zpracování ještě víc urychlí.

Odpovědět 23.4.2013 9:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
heffinek
Člen
Avatar
heffinek:9.5.2013 12:06

ještě že existují tyto stránky :)

 
Odpovědět 9.5.2013 12:06
Avatar
Snorlax
Redaktor
Avatar
Snorlax:20.5.2013 19:31

mám pro vás otázku která vás možná pobaví. jak se čte C#? přijde mi totiž řikat "Cé mřížka" trošku dlouhé :D tahle otázka mi vrtá havou od doby co C# znám :D
P.S.: ano myslím tuto otázku opravdu vážně :D

Odpovědět 20.5.2013 19:31
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Odpovídá na Snorlax
Michal Žůrek (misaz):20.5.2013 19:36

česky ten znak je křížek (nikoli mřížka), logicky by si došel k cé křížek. Ale správně je to sí šarp (Anglicky).

Odpovědět 20.5.2013 19:36
Nesnáším {}, proto se jim vyhýbám.
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Snorlax
Luboš Satik Běhounek:20.5.2013 19:50

V hudbě [cis], v programování [sí šárp].

Odpovědět  +2 20.5.2013 19:50
:)
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Luboš Satik Běhounek
Snorlax:20.5.2013 19:51

V hudbě? ona existuje nějaká písnička o programovacím jazyku? :D

Odpovědět 20.5.2013 19:51
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Snorlax:20.5.2013 19:53

to je dlouhý. divim se že někdo nevymyslel nějakou zkratku :D to dřív usnu než bych to dořekl...

Odpovědět 20.5.2013 19:53
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Snorlax
Luboš Satik Běhounek:20.5.2013 19:56

Ne, v hudbě je C# tón C povýšený o půl tónu :D

Odpovědět  +1 20.5.2013 19:56
:)
Avatar
Odpovídá na Snorlax
Michal Maršálek:20.5.2013 20:02

Anglicky se to čte [sí šarp], stejně jako název toho tónu. Od toho tónu je i odvozený název toho programovacího jazyka. Jinak já tomu česky říkám [cé žebřík]. :D

 
Odpovědět 20.5.2013 20:02
Avatar
Odpovídá na Michal Maršálek
Michal Žůrek (misaz):20.5.2013 20:27

já tomu když už tak česky říkám cé křížek, ale sí šarp je lepší.

Odpovědět 20.5.2013 20:27
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
David Čápka:20.5.2013 20:33

Není to křížek, je to ten hudební znak.

Odpovědět 20.5.2013 20:33
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Michal Žůrek (misaz):20.5.2013 20:35

Však ano, hudební znak, kterému se říká křížek (alespoň podle mého učitele hudebky).

Odpovědět 20.5.2013 20:35
Nesnáším {}, proto se jim vyhýbám.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Michal Maršálek
Snorlax:20.5.2013 21:31

to je ten název jazyku odvozen od toho, že když programátorovi něco nefunguje, tak vydává jekot v oné tónině? :D a cé žebřík je opravdu skvělá varianta :D

Odpovědět  +1 20.5.2013 21:31
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
thegothic360
Člen
Avatar
thegothic360:11.7.2013 12:12

Cus,
jen se chci zeptat, nemelo by u tech kompilovanych jazyku u nevyhod byt:

Nemožnost editace - Jakmile se program jednou zkompiluje do strojového kódu, nelze ho editovat jinak, než opětovnou kompilací. To pochopitelně platí i pro výše zmíněné jazyky.

Diky

Odpovědět  +1 11.7.2013 12:12
Just like the water reflects the face, so the heart reflects the man
Avatar
Magda
Člen
Avatar
Magda:9.11.2013 17:48

Super stránky, hezky napsáno. Doufám, že vydržím a něco se naučím.:)

 
Odpovědět 9.11.2013 17:48
Avatar
Petr Čech
Redaktor
Avatar
Petr Čech:30.11.2013 18:44

Mám takovou otázku...
Co musí uživatel (na Windowsech) udělat, aby C# aplikaci spustil?
:[

Editováno 30.11.2013 18:45
Odpovědět 30.11.2013 18:44
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech
Jan Vargovský:30.11.2013 18:45

Mít nainstalovaný .NET framework ?

 
Odpovědět  +1 30.11.2013 18:45
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Jan Vargovský
Petr Čech:6.12.2013 21:09

Není na WIN nějaká verze už předinstalovaná? Připadá mi celkem ...nepohodlné nutit uživatele instalovat VS. 8|

Editováno 6.12.2013 21:09
Odpovědět 6.12.2013 21:09
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech
Jan Vargovský:6.12.2013 21:17

Proč bys instaloval VS? A ano, na systémech je vždycky už nějaká verze, třeba win 8 + blue už mají .NET 4.5

 
Odpovědět 6.12.2013 21:17
Avatar
Petr Čech
Redaktor
Avatar
Petr Čech:6.12.2013 21:22

No dobře, 1. Jsem moc líný na to, abych hledal, kde se dá sehnat jenom .NET .
2. A co třeba na klasických WIN 7 ?

A nebo je univerzální řešení nastavit v project properties nějakou starou verzi .NETu ?

Odpovědět 6.12.2013 21:22
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech
Jan Vargovský:6.12.2013 22:03

Když nevyužíváš nové věci z .NETu tak klidně. Nevím, nechce se mi to hledat, ale řekl bych že na Win 7 už bude 3.5 .NET

 
Odpovědět 6.12.2013 22:03
Avatar
Petr Čech
Redaktor
Avatar
Odpovědět 6.12.2013 22:25
Why so serious? -Joker
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:8.12.2013 23:23

Díky za parádní článek, těším se na další poznatky.. :)

Odpovědět 8.12.2013 23:23
Chybami se člověk učí, běžte se učit jinam!
Avatar
Nut
Neregistrovaný
Avatar
Nut:7.1.2014 14:53

Hoj,když chci začít v C# a mám Win 7 + knihu C# 2008,tak to mám tedy zahodit a jít na Win8 s novým .NET (VS) ?
Znalosti mám základní.

 
Odpovědět 7.1.2014 14:53
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Nut
David Čápka:9.1.2014 18:11

Za těch pár let se toho v C# změnilo poměrně dost, takhle staré knihy bych nepoužíval.

Odpovědět 9.1.2014 18:11
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Motlja
Člen
Avatar
Motlja:9.1.2014 18:17

Chci se zeptat kdybych měl aplikaci na 4.5.NETa chtěl ji pustit třeba na Win XP Kde by taková verze nebyla. Systém sám zjistí že je problém, nebo to musím jako programátor vyřešit?

Odpovědět 9.1.2014 18:17
Umím a učím se to co chci, to co mě baví a zajímá!!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Motlja
David Čápka:9.1.2014 19:09

Od nového .NETu to řeší sám, ale nevím jestli ti to na XP půjde.

Odpovědět 9.1.2014 19:09
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Motlja
Jan Vargovský:9.1.2014 19:16

Na XP nic s .NETem 4.5 nerozjedeš.

 
Odpovědět 9.1.2014 19:16
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Nut
Jan Vargovský:9.1.2014 19:17

Pokud máš tu možnost, tak určitě.

 
Odpovědět 9.1.2014 19:17
Avatar
Peco
Člen
Avatar
Peco:14.1.2014 17:00

David Čápka, v tom príklade by nemalo byť return c; namiesto return 0; ?

int main(void)
{
        int a, b, c;
        a = 83;
        b = -2;
        c = a + b;
        return 0;
}
Odpovědět 14.1.2014 17:00
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Odpovídá na Peco
Martin Horáček:14.1.2014 17:12

Příkaz return 0; je správně. Tím že funce main() vrátí nulu, dává systému najevo, že program proběhl dobře a neskončil někde uprostřed. :)

 
Odpovědět  +2 14.1.2014 17:12
Avatar
petrph
Člen
Avatar
Odpovídá na Nut
petrph:10.2.2014 9:46

Čau, řekl bych že i s touhle knihou se dostaneš daleko. Třeba tady
http://cs.wikipedia.org/wiki/C_Sharp
máš přehled jednotlivých verzí, čili tam uvidíš co je i v té verzi Visual Studia 2008 a co si budeš muset-až se to všechno naučíš, najít jinde..Hádám že až tak za několik měsíců úpěnlivého studia..

 
Odpovědět 10.2.2014 9:46
Avatar
pangas
Člen
Avatar
pangas:17.2.2014 21:36

Zdravím,
jaktože ve složce Release se nezobrazuje mnou vytvořená aplikace? Ale pouze ve složce Bin?

 
Odpovědět 17.2.2014 21:36
Avatar
Odpovídá na pangas
Michal Žůrek (misaz):17.2.2014 21:39

Protože máš vybrané že má být v Bin/Debug (výchozí). Relase většinou (při výuce určitě) potřebovat nebudeš.

Odpovědět 17.2.2014 21:39
Nesnáším {}, proto se jim vyhýbám.
Avatar
pangas
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
pangas:17.2.2014 21:44

Aha, děkuji, chtěl jsem jenom pro zajímavost sdílet aplikaci..

 
Odpovědět 17.2.2014 21:44
Avatar
Odpovídá na pangas
Michal Žůrek (misaz):17.2.2014 21:48

sdílej debug, dělají to tak (asi) všichni. Osobně abych se přiznal ani moc neznám rozdílí mezi Debug a Relase, asi to bude ale jenom v možniti připojení debuger, ale přesně ti to neřeknu.

Odpovědět 17.2.2014 21:48
Nesnáším {}, proto se jim vyhýbám.
Avatar
pangas
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
pangas:17.2.2014 21:53

Zkoušel jsem to odesílat z mailu, ale mail se vracel se stížností "Blocked File Type".

 
Odpovědět 17.2.2014 21:53
Avatar
Odpovídá na pangas
Michal Maršálek:17.2.2014 22:09

Některé emaily klienty blokují možnost poslat .exe soubor. Poznávají to ale podle koncovky souboru, takže to nemá co dělat debug/release verzí programu. Řešení

  1. přejmenovat koncovku, a přijemci napsat ať si ji přepíše zpět
  2. uložit .exe soubor do archivu (ne .zip, ten asi bude umět email klient prohlédnout)
  3. neposílat .exe soubor emailem (ale jinak)
Editováno 17.2.2014 22:10
 
Odpovědět  +2 17.2.2014 22:09
Avatar
Odpovídá na Michal Žůrek (misaz)
Michal Maršálek:17.2.2014 22:11

Debug by měl být kvůli možnosti napojení debugeru pomalejší.

 
Odpovědět 17.2.2014 22:11
Avatar
Scar
Člen
Avatar
Scar:15.11.2014 22:15

Parádní úvod, tohle by měl znát každý, kdo chce programovat. Sám jsem si něco zopakoval a něco nového naučil. Je to dobře napsané a srozumitelné i pro začátečníky. Díky

 
Odpovědět 15.11.2014 22:15
Avatar
Otmar Nezdařil:3.8.2015 16:54

Díky za zopakování.

 
Odpovědět 3.8.2015 16:54
Avatar
Martin Dragušinec:1.10.2015 10:17
:)
 
Odpovědět 1.10.2015 10:17
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Michal Maršálek
Milan Křepelka:1.10.2015 12:21

Debug je pomalejší primárně proto, že v debugu nejsou žádné optimalizace. PBD soubory se vcelku běžně distribuují i s releasem. Zajímavé odpovědi na toto téma naleznete zde

http://stackoverflow.com/…lease-builds


Distribuovat debug není zrovna nejlepší doporučení a to ani když to dělají všichni :-), což samozřejmě není pravda. Ono na malých prográmkách to nebude žádná tragédie, ale v server side kódu už to bude znát.

 
Odpovědět  +1 1.10.2015 12:21
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:1.10.2015 12:36

Jinak se přidám k názoru, že jde o pěkný úvod.
Nemůžu ovšem souhlasit, že jazyky s virtuálním strojem mají málo zranitelný kód. To tedy moc neplatí. Spíš tedy vůbec. Vemte si nějakou svoji assembly a koukněte se do ní pomocí nástrojů ILSPY, .NET reflektor. Zajímavý je i reflexil, ten jde jaksi ještě dál.

 
Odpovědět  +1 1.10.2015 12:36
Avatar
havlat82
Člen
Avatar
havlat82:23.2.2016 12:09

Ahoj potřeboval bych poradit. Chci udělat přes tohle API chat. Potřebuju se dostat k datům v HTTP odpovědi. Server mi hází odpověď 200 (úspěch), to chatovací okno mi to otevře, ale nedostanu se k těm datům. Problém je, že to vůbec neloguje. Vždy se logne url a pak až WWW Error: Failed to connect to centrum.cz port 6: Timed out. Potřebuju dostat informace z hlavičky a to konkretně secure_session_id, abych moh pak dělat další příkazy API jako send_message, get_pending_mes­sages.. Příklad v dokumentaci fungoval. Mám tam někde logickou chybu a nevidim ji.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ResponseTest : MonoBehaviour {

    private string message = "Ahoj";
    private string url = "";
    //přihlašovací údaje
    private string credentials = "[email protected]:6fe2ccd0525a09f954b276b9cfd285c7";
    private string urlRoot = "@api.livechatinc.com";
    private string licenseId = "licence_id=7082571";
    long visitorsId = 5863759023;
    //sekce API
    string visitors = "/visitors/";
    //příkazy API
    string chatStart = "/chat/start";
    //struktura hlavičky HTTP požadavku
    Dictionary<string, string> headers = new Dictionary<string, string>();

    void Start()
    {
        headers.Add("Content-Type", "application/x-www-form-urlencoded");
        StartChat(message);
    }

    void StartChat(string message)
    {
        //ADD your Form Elements wich you want to transmit
        WWWForm form = new WWWForm();
        form.AddField("X-API-Version", 2);
        byte[] rawData = form.data;

        string adress = "https://" + credentials + urlRoot + visitors + visitorsId + chatStart + "?";
        string parameters = licenseId + "&welcome_message='" + message + "'";
        url = adress + parameters;
        Debug.Log(url);

        WWW www = new WWW(url, rawData, headers);
        StartCoroutine(WaitForRequest(www));
    }

    IEnumerator WaitForRequest(WWW www)
    {
        yield return www;
        // check for errors
        if (www.error == null)
        {
            Debug.Log("WWW Ok!");
            if (www.responseHeaders.Count > 0)
            {
                Debug.Log("responseHeaders.Count"+www.responseHeaders.Count);
                foreach (KeyValuePair<string, string> entry in www.responseHeaders)
                {
                    Debug.Log(entry.Value + "=" + entry.Key);
                }
            }
        }
        else
        {
            Debug.Log("WWW Error: " + www.error);
        }
    }
}
 
Odpovědět 23.2.2016 12:09
Avatar
jakoubek.stanislav:4.10.2016 12:18

Ahoj. Snad píšu svůj dotaz do správného vlákna :-? . Umí C# pracovat s funkcemi stejně, jako se to dělalo ve starém dobrém Céčku? Že si main volal funkce napsané pod ním. A nebo se to řeší jinak? Díky za odpověď. :-)

 
Odpovědět 4.10.2016 12:18
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na jakoubek.stanislav
Luboš Satik Běhounek:4.10.2016 12:35

Proč by to neuměl? :)
V C# máš defaultně main() v Program.cs, ze kterého pak voláš co chceš.

Odpovědět 4.10.2016 12:35
:)
Avatar
Karel Němec
Člen
Avatar
Karel Němec:7.11.2016 18:25

Pěkný článek

 
Odpovědět 7.11.2016 18:25
Avatar
Odpovídá na Luboš Satik Běhounek
jakoubek.stanislav:8.12.2016 12:41

Ahoj. Jde mi o to, jak zavolat funkci. Pokusil jsem se přepsat modelový céčkový prográmek, který zavolá funkci pikrat. Pravděpodobně mám nějakou syntaktickou chybu (lepší varianta) neb věcnou chybu, ale fakt nevím a tak se ptám. Nadává mi, že pikrat je proměnná a já ji používám jako metodu. A vlastně ani řádek

double pikrat(), r, o;

se mu nelíbí.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double pikrat(), r, o;

            Console.WriteLine("Zadej polomer : ");
            r = double.Parse(Console.ReadLine());
            o = 2*pikrat(r);
            Console.WriteLine("Obvod kruhu je: {0}",o);
            Console.ReadKey();

         }

        double pikrat(double x)
        {
            return (x * 3.14);
        }

    }
}
 
Odpovědět 8.12.2016 12:41
Avatar
Odpovídá na jakoubek.stanislav
Libor Šimo (libcosenior):8.12.2016 12:46

double pikrat(), r, o;
To pikrat() zmaz.

Odpovědět 8.12.2016 12:46
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
jakoubek.stanislav:8.12.2016 12:53

Smazal jsem, ale pořád to nechodí. Tentokráte na mě řve na řádku

o = 2*pikrat(r);

"An object reference is required for the non-static field, method od property". Takže tu deklaraci asi dopředu chce.

 
Odpovědět 8.12.2016 12:53
Avatar
Elisse
Člen
Avatar
Elisse:8.12.2016 13:09

Řešení je nejspíš víc, to co říkáš ty určitě ne, deklarace metody fakt ne :)

V tvém případě bych asi napsal

static double pikrat(double x)

Main je statická metoda a nemůžeš z ní volat nestatickou bez vytvoření instance :)

Editováno 8.12.2016 13:10
 
Odpovědět  +1 8.12.2016 13:09
Avatar
Odpovídá na Elisse
jakoubek.stanislav:8.12.2016 13:28

skvělý, díky moc :-)

 
Odpovědět 8.12.2016 13:28
Avatar
Miskyns
Člen
Avatar
Odpovídá na jakoubek.stanislav
Miskyns:13.12.2016 21:32

I když Elisse na tuhle chybu odpověděl, tak se chci zeptat zda by nešlo v mainu přidat

Program p = new Program();

a poté na řádku, kde je

o = 2*pikrat(r);

přepsat na

o = 2*p.pikrat(r);

Byl bych rád, kdyby jste mi napsali, jestli se to takhle dá řešit, díky :)

Odpovědět 13.12.2016 21:32
Proč se to učit, když můžeš použít GOOGLE...
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na Miskyns
krepsy3:13.12.2016 21:49

Tyjo, tak tenhle dotaz mě celkem zaskočil. Působí to totiž docela nepřirozeně (alespoň na mě). Řekl jsem si ale, že to nejspíš půjde, protože proč by ne, je to naprosto logické, ale raději jsem to otestoval. A nemýlil jsem se, funguje to. Použitý kód, který tedy mi VS normálně vzalo:

class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine((new Program()).pikrat(2));
        Console.ReadKey();
    }

    private double pikrat (double x)
    {
        return x * Math.PI;
    }
}
Editováno 13.12.2016 21:51
Odpovědět 13.12.2016 21:49
Programátor je stroj k převodu kávy na kód.
Avatar
Miskyns
Člen
Avatar
Odpovídá na krepsy3
Miskyns:14.12.2016 16:49

Přece jenom využívání statiky není dobré, a vždy to lze nějak obejít :)

Odpovědět  -1 14.12.2016 16:49
Proč se to učit, když můžeš použít GOOGLE...
Avatar
Elisse
Člen
Avatar
Odpovídá na Miskyns
Elisse:14.12.2016 16:56

Osobně mi to přijde lepší než vytvářet třídu, která obsahuje jednu metodu a žádné proměnné :-O

 
Odpovědět  +1 14.12.2016 16:56
Avatar
Miskyns
Člen
Avatar
Odpovídá na Elisse
Miskyns:14.12.2016 16:59

Každý má jiný vkus, ale konečný výsledek u mě by vypadal takto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vytvoření instance třídy
            Program() p = new Program();
            double r, o;

            Console.WriteLine("Zadej polomer : ");
            r = double.Parse(Console.ReadLine());
            //Zavolání metody v této třídě
            o = 2*p.pikrat(r);
            Console.WriteLine("Obvod kruhu je: {0}",o);
            Console.ReadKey();

         }

        double pikrat(double x)
        {
            return (x * 3.14);
        }

    }
}
Odpovědět 14.12.2016 16:59
Proč se to učit, když můžeš použít GOOGLE...
Avatar
Elisse
Člen
Avatar
Odpovídá na Miskyns
Elisse:14.12.2016 17:02

Mně přijde hodně divná ta instance z třídy, která obsahuje Main (alespoň v tomhle případě). To je to co mně trápí, jinak proti instancování třídy na metodu nic nemám.

Editováno 14.12.2016 17:05
 
Odpovědět 14.12.2016 17:02
Avatar
krepsy3
Redaktor
Avatar
krepsy3:14.12.2016 21:53

Můj výsledek by vypadal asi takhle:

using System;

class Program
{
        public static void Main(string[] args)
        {
                Console.WriteLine("Zadej poloměr kruhu: ");
                double r = 0;
                double.TryParse(Console.ReadLine(), out r);
                Console.WriteLine((new Kruh(r)).ToString());
        }
}

class Kruh
{
        private double obvod, obsah, polomer;

        public Kruh(double r)
        {
                polomer = r;
                obvod = r * 2 * Math.PI;
                obsah = Math.PI * Math.Pow(r, 2);
        }

        public override string ToString()
        {
                return "Poloměr: " + polomer + "Obvod: " + obvod + "Obsah: " + obsah;
        }
}

A mimochodem: to, že je statika nesmysl, je nesmysl. Zrovna pro použití u třídy program (resp. Metody main) je celkem logické - systém spustí jednu aplikaci na jediném novém unikátním vlákně a následně zavolá metodu Main jako entry point dané aplikace. Stejné je to s konzolí - máme ji jednu jedinou, proto je třída statická.

Pokud by chtěl někdo na něco tak banálního jako je příklad nahoře využít objekty, prosím, ale nechť ať se drží dobrých zásad OOP, tedy dle kódu, který jsem nastínil v tomto příspěvku (psáno z hlavy, možná chyba v syntaxu). Aby to bylo úplně správně, třída Kruh by měla dědit ze třídy Geometrický útvar a implementovat po svém metody pro nalezení daných paramerů), popřípadě by to šlo řešit i přes rozhraní.

Editováno 14.12.2016 21:54
Odpovědět  +1 14.12.2016 21:53
Programátor je stroj k převodu kávy na kód.
Avatar
Václav Tobiška:6. ledna 16:07

Díky moc za článek(ky) s tématikou C#. I Po letech od vydání jsou srozumitelné a naučné. Už jsem jich tu několik pročetl a nestačím se divit, co vše mi objasnily, co nového jsem se naučil. Děkuju!

 
Odpovědět  +1 6. ledna 16:07
Avatar
Martin Ďurček:17. května 17:57

Veľmi pekný úvod do fungovania C# :-)

 
Odpovědět 17. května 17:57
Avatar
Marek Gottwald:25. června 12:09

Článek mě jako naprostého začátečníka hezky seznámil s úvodem do C#. :-)

 
Odpovědět 25. června 12:09
Avatar
strejda grinch:21. července 8:34

Veľmi pekne napísané, keďže ma programovanie baví už z doby BASICu na Commodore a Didaktikoch. C# je diametrálne odlišný jazyk, no vďaka tejto ineraktívnej učebnici si myslím, že by som ho mohol zvládnuť. Nechám sa prekvapiť, či sa dostanem až na taký level, aby som mohol zmeniť zamestnanie :)

 
Odpovědět  +1 21. července 8:34
Avatar
Tomáš Janda:18:31

Parádně napsaný článek uvozující do základů programování.
Teď už jen jet lekci za lekcí a těším se na svůj první výtvor...

Odpovědět 18:31
Trpělivost-vytrvalost-pokora
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 86 zpráv z 86.