C# je programski jezik višestruke paradigme koji usvaja strogo tipovanje, imperativne, deklarativne, funkcionalne, generične, objektno-orijentirane (ima klase) i komponentno-orijentirane programske discipline. Razvio ga je Microsoft unutar .NET inicijative, a kasnije su ga za standard odobrili Ecma (ECMA-334) i ISO (ISO/IEC 23270:2006). C# je jedan od programskih jezika dizajniran za CLI.
C# namjerava biti jednostavan, moderan, objektno-orijentirani programski jezik opće namjene. Njegov razvojni tim predvodi Anders Hejlsberg. Najnovija verzija je C# 5.0, koja je izdata 15. augusta 2012.
Ciljevi dizajna Spisak ECMA standarda ima sljedeće ciljeve za C#: C# teži biti jednostavan, moderan, objektno-orijentirani programski jezik opće namjene. Jezik, kao i njegove implementacije, trebaju omogućiti podršku za softverske inženjerske principe kao što su provjera strogog tipovanja, provjera granica nizova, provjera pokušaja korištenja nepozvanih varijabli, kao i automatsko upravljanje memorijom (tzv. garbage kolekcija). Softverska robusnost, trajnost i programerska produktivnost su važni. Jezik teži da se koristi u razvoju softverskih komponenti adekvatnih za razvoj u distribuiranim okolnostima. Portabilnost izvornog koda je veoma važna, kao i portabilnost programera, posebno za one programere koji su upoznati sa C i C++ programskim jezicima. Podrška za internacionalizaciju je veoma važna. C# teži biti podesan za pisanje aplikacija za hostovane i embedded sisteme, u opsegu od veoma velikih koji koriste sofisticirane operativne sisteme, do veoma malih koji imaju posvećene funkcije. Iako C# aplikacije teže biti ekonomične u vezi sa zahtjevima memorije i procesorske moći, jezik ne teži direktno da se takmiči u performansama i veličini sa programskim jezikom C ili asemblerom.
Historija Tokom razvoja .NET Frameworka, klasne biblioteke su originalno pisane korištenjem sistema kompajlera upravljanog koda zvanog Simple Managed C (SMC). U januaru 1999, Anders Hejlsberg je formirao tim za razvoj novog jezika svojevremeno zvanog Cool, koji je bio skraćenica za "C-like Object Oriented Language" (). Microsoft je uzeo u obzir da zadrži "Cool" kao krajnje ime jezika, ali ga nije odabrao iz pravnih razloga. Vremenom .NET projekt je javno objavljen u julu 2000. na stručnoj razvojnoj konferenciji, promijenio ime u C#, a klasne biblioteke su, kao i ASP.NET runtime, ubačene u C#.
Naziv desno|mini|100x100px|Oštro C, muzička nota "C♯" (C oštri) je inspirisan muzičkom notacijom gdje oštro indicira da napisana nota treba napraviti poluton višeg tona. Ovo je slično imenu jezika C++, gdje "++" pokazuje da varijabla treba biti povećana za 1; oštri simbol također liči na ligaturu četiri "+" simbola (mreža dva sa dva), dalje pokazujući da je jezik inkrement jezika C++.
Zbog tehničkih ograničenja ekrana (standardni fontovi, preglednici, itd.) i činjenice da oštri simbol (C♯) nije prisutan na standardnim tastaturama, brojni znak (C#) je odabran da predstavlja oštri simbol u pisanom imenu programskog jezika. Ova konvencija je opisana u ECMA-334 C# jezičkoj specifikaciji.
Verzije Verzija Specifikacije Datum .NET Visual Studio Ecma ISO/IEC Microsoft C# 1.0decembar 2002april 2003 januar 2002 januar 2002 .NET Framework 1.0 Visual Studio .NET 2002 C# 1.1C# 1.2 oktobar 2003 april 2003 .NET Framework 1.1 Visual Studio .NET 2003 C# 2.0 juni 2006 septembar 2006 septembar 2005 novembar 2005 .NET Framework 2.0.NET Framework 3.0 Visual Studio 2005Visual Studio 2008 C# 3.0 colspan="2" rowspan="2" august 2007 novembar 2007 .NET Framework 2.0 (bez LINQ) .NET Framework 3.0 (bez LINQ).NET Framework 3.5 Visual Studio 2008 C# 4.0 april 2010 april 2010 .NET Framework 4 Visual Studio 2010 C# 5.0 decembar 2017 decembar 2018 juni 2013 august 2012 .NET Framework 4.5 Visual Studio 2012Visual Studio 2013 C# 6.0 colspan="2" rowspan="7" Draft juli 2015 .NET Framework 4.6.NET Core 1.0.NET Core 1.1 Visual Studio 2015 C# 7.0 Specification proposal mart 2017 .NET Framework 4.7 Visual Studio 2017 v15.0 C# 7.1 Specification proposal august 2017 .NET Core 2.0 Visual Studio 2017 v15.3 C# 7.2 Specification proposal novembar 2017 Visual Studio 2017 v15.5 C# 7.3 Specification proposal maj 2018 .NET Core 2.1.NET Core 2.2.NET Framework 4.8 Visual Studio 2017 v15.7 C# 8.0 Specification proposal septembar 2019 .NET Core 3.0.NET Core 3.1 Visual Studio 2019 v16.3 C# 9.0 Specification proposal septembar 2020 .NET 5.0 Visual Studio 2019 v16.8
+ Sažetak verzija C# 2.0 C# 3.0 C# 4.0 C# 5.0 BudućeDodatemogućnosti Generics Djelomični tipovi Anonimne metode Iteratori Nulabilni tipovi Getter/setter odvojena pristupačnost konverzije grupa metoda (delegati) Ko- i kontra-varijanse za delegate Statične klase Implicitno tipizirane lokalne varijable Inicijalizatori objekata i kolekcije Automatski implementirana svojstva Anonimni tipovi Metode ekstenzija Upitni izrazi Lambda funkcije Ekspresivna grananja Parcijalne metode Dinamičko bindiranje Nazvani i opcionalni argumenti Generičke ko- i kontra-varijanse Prošireni interoperabilni tipovi ("NoPIA") Asinhrone metode Pozivni info atributi C# 6.0 planirano/urađeno Kompajler-kao-servis (Roslyn) Unos statičkog tipa članova u imenski prostor Filteri izuzetaka Čekanje u "uhvati"/finalnim blokovima Automatski svojstveni inicijalizatori Zadate vrijednosti za samo getter svojstva Članovi koji su utjelovljeni ekspresijom Null propagator (Succinct null provjera) String interpolacija nameof operator Besparametarski strukturni konstruktori Rječnički inicijalizator C# 7.0 prijedlozi Iskazi deklaracija Parametarski nizovi za IEnumerable interfejse
Sintaksa Sržna sintaksa C# jezika je slična jezicima iz C porodice kao što su C, C++ i Java. U biti: Tačka-zarez se koristi da se opiše kraj tvrdnje. Zaobljene zagrade se koriste da grupiraju tvrdnje. Tvrdnje su obično grupirane u metode (funkcije), metode u klase/razrede, a klase u imenski prostor (namespaces). Varijable su pridružene korištenjem znaka jednakosti, ali u usporedbi korištenjem dva uzastopna znaka jednakosti. Oštre zagrade se koriste sa nizovima, da bi ih deklarisale i da bi se uzela vrijednost datog indeksa od jednoj od njih.
Odlike
Portabilnost Prema dizajnu, C# je programski jezik koji najdirektnije reflektira temeljnu CLI infrastrukturu. Većini njegove suštinske vrste odgovaraju vrijednosni tipovi koje sprovodi CLI okvir (framework). Ipak, jezičke specifikacije ne navode zahtjeve generacije koda datog kompajlera: što znači da se ne navodi da C# kompajler mora ciljati Common Language Runtime, ili generisati Common Intermediate Language (CIL), ili generisati drugi specifični format. Teoretski, C# kompajler može generisati mašinski kod kao tradicionalni kompajleri za C++ ili Fortran.
Tipovanje C# podržava strogo pisane implicitne varijabilne deklaracije pomoću koda var, te implicitno zadatih nizova sa kodom new[] koje prate inicijalizatori kolekcije.
C# podržava striktni tip podatka boolean: bool. Tvrdnje koje uzimaju uvjete, kao što je while i if, zahtijevaju iskaz tipa koji usvaja true (istiniti) operator, kao što je tip Boolean. Dok C++ također ima tip Boolean, on može biti slobodno pretvoreno u i od integera (cjelobrojna vrijednost), te iskazi kao što je if(a) zahtijevaju samo da je a pretvorljiv u bool, dopuštajući a da bude int, ili pointer. C# onemogućava ovom pristupu "cjelobrojnog značenja istine ili neistine", na temeljima koji forsiraju programere da koriste iskaze koji vraćaju upravo bool mogu se spriječiti određeni tipovi programskih grešaka uobičajenih u C-u ili C++-u kao npr. if (a = b) (korištenje zadatka = umjesto jednakosti ==).
C# je sigurniji po tipovanju nego C++. Jedine implicitne pretvorbe koje su zadate su one koje se smatraju sigurnim, kao što je proširivanje cijelih brojeva. Ovo se provodi pri vremenu kompajliranja, tokom JIT-a, i, u nekim slučajevima, pri pokretanju. Implicitne konverzije se ne dešavaju između Booleanova i integera, niti između enumeracijskih članova i integera (osim za literarnu 0, što se može implicitno pretvoriti u bilo koji enumerirani tip). Bilo koja konverzija koju je korisnik definisao mora biti eksplicitno označena kao eksplicitna ili implicitna, za razliku od C++ copy constructora i operatora konverzije, koji su oba implicitni prema zadatim vrijednostima.
C# ima eksplicitnu podršku za kovarijansu i kontravarijansu u generičkim tipovima, za razliku od C++-a koji ima određen stepen podrške za kovarijansu jednostavno zbog semantike tipova koji se vraćaju na virtualne metode.
Enumeracijski članovi su postavljeni u njihov vlastiti obujam.
Jezik C# ne dopušta globalne varijable ili funkcije. Sve metode i članovi moraju biti deklarisani unutar klasa (razreda). Statički članovi javnih klasa mogu se zamijeniti za globalne varijable i funkcije.
Lokalne varijable ne mogu zasjeniti varijable priloženi blok, za razliku od jezika C i C++.
Meta programiranje Meta programiranje preko C# atributa dijelom je jezika. Većina ovih atributa dupliciraju funkcionalnsot GCCova i preprocesorskih direktiva zavisnih o platformi Visual C++a.
Metode i funkcije Kao C++, a za razliku od Jave, C# programer moraju koristiti kod virtual za dopuštanje metodama da budu nadjačane podklasama.
Metode proširenja u C# dopuštaju programerima da koriste statičke metode kao da su one metode sa tabele klasne metode, što dopušta programerima da dodaju metode objektu za koji osjećaju da treba postojati na tom objektu i njegovim derivatima.
Tip dynamic dopušta metodu vezivanja runtimea, što dopušta pozivanje metoda slično kao u JavaScriptu i objektnu kompoziciju runtimea.
C# ima podršku za strogo tipovane funkcijske pointere preko koda delegate. Kao što Qt framework ima pseudo-C++ komande signal i slot, C# ima semantiku specifičnu okružnim stilskim događajima "publish-subscribe", mada C# za to koristi delegate.
C# nudi kao Java synchronized pozivanje metoda, preko atributa [MethodImpl(MethodImplOptions.Synchronized)], i ima podršku za uzajamno isključive "katance" preko koda lock.
Svojstva C# nudi svojstva kao sintaktički šećer za opći obrazac u kojem par metoda, pristupnik (getter) i mutator (setter) kapsuliraju operacije na jednom samom atributu unutar klase. Nema viška potpisa metoda za implementacije Getter/Setter koje trebaju biti napisane, a svojstvu se može pristupiti pomoću atributa sintakse umjesto više opširnog poziva metoda.
Namespace C# kod namespace omogućava isti nivo kodne izolacije kao Javin package i kod C++-a , sa veoma sličnim pravilima i mogućnostima za package.
Pristupanje memoriji U C#, pokazivači memorijske adrese mogu biti korišteni samo unutar blokova specifično označenih kao nesigurni, a programi sa nesigurnim kodom trebaju adekvatne dozvole za pokretanje. Većina pristupa objektima urađena je kroz sigurne objektne reference, koje uvijek bilo pokazuju na "žive" objekte ili imaju dobro definisane null vrijednost; nemoguće je dobiti referencu od "mrtvog" objekta (onaj koji je prikupljen od gapbage kolekcije), ili od slučajno odabranog bloka memorije. Nesigurni pokazivač može pokazati na instancu vrijednosnog tipa, niza, stringa, ili bloka memorije dodijeljenog na stack. Kod koji nije markiran nesigurnim može i dalje pohranjivati i manipulisati pokazivače kroz kodni System.IntPtr tip, ali ih ne može dereferencirati.
Upravljana memorija ne može biti izričito oslobođena; umjesto toga, automatski je prikupljena u garbage kolekciji. Garbage kolekcija adresira problem curenja memorije oslobađanjem programera od odgovornosti za oslobađanje memorije koja više nije potrebna.
Izuzeci Provjereni izuzeci nisu prisutni u C# (za razliku od Jave). Ovo je bila svjesna odluka bazirana na problemima skalabilnosti i verzionabilnosti.
Polimorfizam