|  |  |
| --- | --- |
|  | *Správny názov tohto článku je* **C#***. Vynechanie **#** je spôsobené technickými obmedzeniami.* |

**C#** (v angličtine *c sharp* - vysl. *sí šarp*) je objektovo-orientovaný programovací jazyk vyvinutý spoločnosťou Microsoft ako časť ich iniciatívy .NET. Microsoft si za základ pre nový jazyk C# zobral C++ a jazyk Java. 
C# bolo navrhované s úmyslom vyvážiť silu jazyka C++ a tú spojiť s možnosťou rýchleho programovania "rapid application development", ktoré ponúkali jazyky ako napríklad Visual Basic, Delphi. Posledná verzia jazyku C# je 11, vydaná v Novembri 2022.

Tento článok popisuje jazyk tak, ako je definovaný v štandardoch ISO a ECMA, pričom nepopisuje detaily implementácie firmou Microsoft. Pre popis implementácie jazyka firmou Microsoft si pozrite heslo Microsoft Visual C#.

Ciele pri tvorbe jazyka
-----------------------

V štandarde ECMA boli kladené nasledovné ciele pri tvorbe jazyka C#:

* C# bol vytváraný tak, aby bol **jednoduchým**, **moderným**, **objektovo orientovaným** jazykom pre **všeobecné použitie**.
* Jazyk a jeho implementácie by mali poskytovať podporu pre nasledovné princípy softvérového inžinierstva ako silná typová kontrola, kontrola ohraničenia polí, detekciu pokusov na využitie neinicializovaných premenných a automatickú správu pamäte. Dôležitými vlastnosťami je tiež robustnosť, odolnosť a produktivita.
* Jazyk je tvorený so zreteľom na vývoj softvérových komponentov, ktoré sú vhodné pre nasadenie v distribuovaných prostrediach.
* Prenositeľnosť zdrojového kódu je mimoriadne dôležitá, rovnako ako aj prenositeľnosť znalostí programátorov so skúsenosťami s jazykmi C a C++.
* Lokalizácia a internacionalizácia je mimoriadne dôležitá.
* C# je jazyk zameraný na tvorbu aplikácií pre hostované, ako aj embedded systémy s ohľadom na veľkú škálovateľnosť od veľmi veľkých systémov používajúcich sofistikované operačné systémy po veľmi malé zariadenia pre špecializované úlohy.
* Aj keď je jazyk C# plánovaný na ekonomické využívanie pamäte a procesorového času, nie je kompletne zameraný na výkonnosť a veľkosť výsledného binárneho kódu ako jazyky C alebo assembler.

História architektúry
---------------------

Tvorca princípov a hlavný architekt jazyka C# je Anders Hejlsberg. Jeho predchádzajúce skúsenosti s programovacími jazykmi a dizajnom frameworkov (Visual J++, Borland Delphi, Turbo Pascal) sú ľahko rozpoznateľné v syntaxi jazyka, rovnako ako aj v CLR (Common Language Runtime). Jeho analýza nedostatkov súčasných hlavných programovacích jazykov ako napríklad C++, Java, Delphi a Smalltalk, ktoré prezentoval vo svojich technických príspevkoch a rozhovoroch stáli pri zrode základov CLR a ktoré neskôr ovplyvnili aj dizajn samotného jazyka C#. Niektoré korene a princípy samozrejme pochádzajú aj z iných programovacích jazykov.

Vlastnosti jazyka
-----------------

C# ako programovací jazyk v niektorých ohľadoch priamo odráža vlastnosti vrstvy CLI (Common Language Infrastructure), ktorá leží pod ním. Tento jazyk bol priamo navrhnutý tak, aby umožňoval využitie všetkých vlastností, ktoré poskytuje CLI, na rozdiel od jazykov, ktoré majú vlastnú syntax a využívajú len podmnožinu vlastností CLI (ako napríklad Visual Basic). Väčšina typov zavedených v jazyku C# priamo korešponduje s hodnotovými typmi implementovanými v CLI frameworku, špecifikácia jazyka C# však neurčuje podmienky, ktorými sa má generovanať kód z kompilátora. To znamená, že kompilátor jazyka C# nemusí mať za cieľovú podpornú platformu priamo CLI, respektíve vôbec nemusí generovať medziprekladový jazyk MSIL (**Microsoft Intermediate Language**), ani žiaden iný formát. Teoreticky je možné vytvoriť kompilátor jazyka C#, ktorý bude prekladať priamo do strojového kódu ako tradičné kompilátory jazyka C++, Fortran a podobne. 

Pri porovnaní s jazykmi C a C++ došlo k rôznym obmedzeniam a rozšíreniam, z ktorých sú najvýraznejšie tieto:

* Neexistujú globálne premenné. Všetky metódy a atribúty musia patriť niektorej triede, podobne ako v iných objektovo-orientovaných jazykoch.
* Na rozdiel od C a C++ sa názvy premenných nesmú v uzatváracích blokoch opakovať, čo vedie k zlepšeniu čitateľnosti kódu a zamedzuje nejednoznačnostiam a zmiatnutiu pri čítaní zdrojového kódu.
* Namiesto globálnych funkcií ako napríklad `printf()` v jazyku C musia byť všetky metódy deklarované s príslušnosťou k triede. Triedy sú v drvivej väčšine organizované do menných priestorov (`namespace`)

Ukážky z kódu
-------------

### Poznámky

C# používa dvojitú lomku (//) na označenie komentáru.

```
public class Ahoj
{
 // komentár
 public static void Svet(int firstParam) {} //Iný komentár
}

```

Na viacriadkový komentár sa používa lomka s hviezdičkou (/\* pre začiatok, \*/ pre ukončenie) 

```
 public class Ahoj {
 public static void Main () {
 /\* toto 
 je viacriadkový 
 komentár\*/
 Console.Writeline("Ahoj!");
 }
 }

```

Príklad
-------

```
 public class Pole {
 public static void Main () {
 int[] numbers = {5, 6, 1, -2, 0};
 foreach (int i in numbers) {
 System.Console.WriteLine(i);
 }
 }
 }

```

Programovací jazyk C# je objektovo orientovaný a zdrojový kód sa člení do tried. Názvy tried
by mali korešpondovať s ich funkcionalitou. Tento program je tvorený triedou *Pole*, ktorá obsahuje funkciu *main*. Vo funkcii *main* sa vytvára pole o veľkosti 5
prvkov. Následne sú hodnoty jednotlivých prvkov poľa vypísané na štandardný
výstup.

Výstup programu:

5

6

1

-2

0

Rozdiely oproti C++
-------------------

* Automatické uvoľnenie pamäte pri dátových typoch
* Trieda sa dá odvodiť len od jednej triedy, ostatné sa dajú len implementovať ako rozhrania
* Vlastnosti sa dajú definovať automaticky ako v príklade

```
...
 public long ValidValue
 {
 get
 {
 return nacitajHodnotuDynamicky();
 }
 set
 {
 if(value>0 && value<50)
 {
 nastavHodnotu(value);
 }
 }
 }
...

obj.ValidValue = 5;

...

```

* Baltie - C# programovací prostredí pre deti Baltie

| * z
* d
* u
Významné programovacie jazyky |
| --- |
| 
* Ada
* ALGOL
* APL
* AWK
* BASIC
* C
* C++
* C#
* COBOL
* D
* Eiffel
* Erlang
* F#
* Forth
* Fortran
* Go
* Haskell
* IDL
* Java
* JavaScript
* JSI
* Kotlin
* Lisp
* Logo
* Lua
* ML
* Objective-C
* Object Pascal (Delphi)
* Pascal
* Perl
* PHP
* PL/I
* PL/M
* PL/SQL
* Prolog
* Python
* R
* Ruby
* Rust
* SAS
* Scratch
* sh
* Scheme
* Simula
* Smalltalk
* SQL
* Swift
* Visual Basic

 |