From Wikipedia, the free encyclopedia
C#[lower-alpha 2][lower-alpha 3] 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♯ | |
---|---|
Programska Paradigma | višestruka: objektno-orijentiran, strukturiran, naredbeni, vođen događajima i zadacima, funkcionalan, generičan, reflektivan, konkurentan |
Pojavio se | 2000 |
Tvorac | Microsoft |
Sistem tipovanja | statično, dinamičko,[1] (ostalo...) |
Glavne implementacije | Visual C#, .NET Framework, Mono, DotGNU |
Dijalekti | Cω, Spec#, Polyphonic C# |
Utjecali | C++,[2] Eiffel, Java,[2] Modula-3, Object Pascal,[3] ML, Icon, Haskell, Cω, F#[lower-alpha 1] |
Utjecao na | D, Dart,[4] F#, Java,[5] Kotlin, Monkey, Nemerle, Swift,[6] Vala |
C# namjerava biti jednostavan, moderan, objektno-orijentirani programski jezik opće namjene.[7] Njegov razvojni tim predvodi Anders Hejlsberg. Najnovija verzija je C# 5.0, koja je izdata 15. augusta 2012.
Spisak ECMA standarda ima slijedeće ciljeve za C#:[7]
Tokom razvoja .NET Frameworka, klasne biblioteke su originalno pisane korištenjem sistema kompajlera upravljanog koda zvanog Simple Managed C (SMC).[8][9] 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" (bosanski: Objektno-orijentirani jezik nalik na C).[10] 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#.
"C♯" (C oštri) je inspirisan muzičkom notacijom gdje oštro indicira da napisana nota treba napraviti poluton višeg tona.[11] 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++.[12]
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.[13] Ova konvencija je opisana u ECMA-334 C# jezičkoj specifikaciji.[7]
Verzija | Specifikacije | Datum | .NET | Visual Studio | ||
---|---|---|---|---|---|---|
Ecma | ISO/IEC | Microsoft | ||||
C# 1.0 | decembar 2002 | april 2003 | januar 2002 | januar 2002 | .NET Framework 1.0 | Visual Studio .NET 2002 |
C# 1.1 C# 1.2 |
oktobar 2003 | april 2003 | .NET Framework 1.1 | Visual Studio .NET 2003 | ||
C# 2.0[14] | juni 2006 | septembar 2006 | septembar 2005[lower-alpha 4] | novembar 2005 | .NET Framework 2.0 .NET Framework 3.0 |
Visual Studio 2005 Visual Studio 2008 |
C# 3.0[15] | None | august 2007 | novembar 2007 | .NET Framework 2.0 (bez LINQ)[16] .NET Framework 3.0 (bez LINQ)[16] |
Visual Studio 2008 | |
C# 4.0[17] | april 2010 | april 2010 | .NET Framework 4 | Visual Studio 2010 | ||
C# 5.0[18] | decembar 2017 | decembar 2018 | juni 2013 | august 2012 | .NET Framework 4.5 | Visual Studio 2012 Visual Studio 2013 |
C# 6.0[19] | None | Draft | juli 2015 | .NET Framework 4.6 .NET Core 1.0 .NET Core 1.1 |
Visual Studio 2015 | |
C# 7.0[20][21] | Specification proposal Arhivirano 13. 3. 2021. na Wayback Machine | mart 2017 | .NET Framework 4.7 | Visual Studio 2017 v15.0 | ||
C# 7.1[22] | Specification proposal Arhivirano 11. 3. 2021. na Wayback Machine | august 2017 | .NET Core 2.0 | Visual Studio 2017 v15.3[23] | ||
C# 7.2[24] | Specification proposal | novembar 2017 | Visual Studio 2017 v15.5[25] | |||
C# 7.3[26] | Specification proposal Arhivirano 7. 3. 2021. na Wayback Machine | maj 2018 | .NET Core 2.1 .NET Core 2.2 .NET Framework 4.8 |
Visual Studio 2017 v15.7[25] | ||
C# 8.0[27] | Specification proposal | septembar 2019 | .NET Core 3.0 .NET Core 3.1 |
Visual Studio 2019 v16.3[28] | ||
C# 9.0[29] | Specification proposal | septembar 2020 | .NET 5.0 | Visual Studio 2019 v16.8[28] |
C# 2.0 | C# 3.0 | C# 4.0 | C# 5.0 [30] | Buduće | |
---|---|---|---|---|---|
Dodate mogućnosti |
|
Sržna sintaksa C# jezika je slična jezicima iz C porodice kao što su C, C++ i Java. U biti:
Prema dizajnu, C# je programski jezik koji najdirektnije reflektira temeljnu CLI infrastrukturu.[38] 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.
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 preko C# atributa dijelom je jezika. Većina ovih atributa dupliciraju funkcionalnsot GCCova i preprocesorskih direktiva zavisnih o platformi Visual C++a.
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
.
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.
C# kod namespace
omogućava isti nivo kodne izolacije kao Javin package
i kod C++-a
namespace
, sa veoma sličnim pravilima i mogućnostima za package
.
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.
Provjereni izuzeci nisu prisutni u C# (za razliku od Jave). Ovo je bila svjesna odluka bazirana na problemima skalabilnosti i verzionabilnosti.[39]
Za razliku od C++, višestruko nasljeđivanje ne podržava C#, iako klasa može implementirati bilo koji broj interfejsa. Ovo je bila dizajnerska odluka od strane glavnog arhitekte jezika da se izbjegnu komplikacije i pojednostave arhitekturni zahtjevi kroz CLI. Kod implementiranja višestrukih interfejsa koji sadrže metodu sa istim potpisom, C# omogućava programeru implementiranje svake metode zavisno od toga koji interfejs ta metoda poziva, ili, kao Java, omogućava programeru implementaciju metode jednom i da ima jednostruko pozivanje po pozivu kroz bilo koji od interfejsa klase.
Ipak, C#, za razliku od Jave, podržava preopterećenje operatora. Jedino najčešće preopterećeni operatori u C++ mogu biti preopterećeni u C#.
Kroz primarno imperativni jezik, C# 2.0 je ponudio ograničenu podršku za funkcionalno programiranje kroz funkcije prve klase i zatvaranja u formi nepoznatih delegata. C# 3.0 proširena podrška za funkcionalno programiranje sa predstavljanjem lahkih sintaksi za lambda ekspresije, metode ekstenzija, ili sintaksa liste poimanja u obliku jezika "upita poimanja".
C# ima unificirani tip sistema. On se zove Common Type System (CTS).[40]
Unificirani tip sitema pokazuje da svi tipovi, uključujući primitive kao što su integeri, su podklase klase
System.Object
. Npr. svaki tip nasljeđuje
ToString()
metodu.
CTS odvaja tipove podataka u dvije kategorije:[40]
Instance tipova value nemaju referentni identitet niti referentnu usporednu semantiku - poređenja jednakosti i nejednakosti za vrijednosne tipove porede stvarne tipove podataka sa instancama, sve dok se prateći operatori ne preopterete. Vrijednosni tipovi su izvedeni iz
System.ValueType
, uvijek imaju default vrijednost, a mogu uvijek biti kreirani i kopirani. Neka ostala ograničenja na vrijednosne tipove su ta da oni ne mogu biti izvedeni jedni iz drugih (ali mogu implementirati interfejse) i ne mogu imati izričit default (besparametarski) konstruktor. Primjeri vrijednosnih tipova su svi primitivni tipovi, kao
int
(potpisani 32-bitni cijeli broj),
float
(32-bitni IEEE floating-point broj),
char
(16-bitni Unicode kodna jedinica), te
System.DateTime
(identificira specifičnu tačku u vremenu sa preciznošću u nanosekundama). Ostali primjeri su
enum
(enumeracije) i
struct
(korisnički definisane strukture). U kontrastu, referentni tipovi imaju pojam referentnog identiteta - svaka instanca referentnog tipa je sama po sebi različita od svake druge instance, čak iako su podaci unutar obje instance jednaki. Ovo se reflektira u zadatim poređenjima jednakosti i nejednakosti za referentne tipove, što se ispituje za referentne radije nego strukturnu jednakost, sve dok se prateći operatori ne preopterete (kao što je slučaj za
System.String
). Generalno, nije uvijek moguće kreirati instancu referentnog tipa, niti kopirati postojeću instancu, ili obaviti vrijednosnu usporedbu na dvije postojeće instance, ipak specifični referentni tipovi mogu omogućiti takve servise izlaganjem javnog konstruktora ili implementiranjem pratećeg interfejsa (kao što su
ICloneable
i
IComparable
). Primjeri referentnih tipova su
object
(konačna bazna klasa za sve ostale C# klase),
System.String
(string od Unicode znakova), i
System.Array
(bazna klasa za sve C# nizove).
Obje kategorije tipova su proširive sa korisnički definiranim tipovima.
Primjer:
int foo = 42; // vrijednosni tip
object bar = foo; // foo je boxiran u bar
int foo2 = (int)bar; // deboxiran u vrijednosni tip
Pojedinosti C# navode minimalni skup biblioteka klasa i tipova za koje se očekuje da ih kompajler ima dostupne. U praksi, C# je najčešće korišten sa nekim implementacijama iz Common Language Infrastructure (CLI), što je standardizirano kao ECMA-335 Common Language Infrastructure (CLI).
Slijedi veoma jednostavan C# program, verzija klasičnog "Hello world" primjera:
using System;
class Program
{
static void Main()
{
Console.WriteLine("Selam, svijete!");
}
}
Efekt je da se piše ispisuje tekst na izlazu konzole:
Selam, svijete!
Svaka linija ima svrhu:
using System;
Linija koda iznad govori kompajleru da koristi klasu System
kao prefiks za tipove korištene u izvornom kodu. U ovom slučaju, kada kompajler vidi korištenje koda Console
kasnije u izvornom kodu, on pokušava naći tip zvani Console
, prvo u trenutnoj montaži, koju prate sve referencirane montaže. U ovom slučaju kompajler ne uspijeva naći takav tip, pošto je ime tipa ustvari System.Console
. Kompajler tada pokušava naći tip zvani System.Console
korištenjem kodnog System
prefiksa iz tvrdnje
using
, i ovoga puta uspijeva. Tvrdnja
using
dopušta programeru da iskaže sve prefikse kandidata da koriste tokom kompajliranja umjesto korištenja uvijek punih imena tipova.
class Program
Iznad se nalazi definicija klase. Sve između pratećeg para zagrada opisuje
Program
.
static void Main()
Ovo deklariše člana klase metode gdje program počinje pokretanje. .NET runtime poziva
Main
metodu. (Napomena:
Main
može također biti pozvana svejedno odakle, kao iz neke druge metode, npr. iz druge metode
Program
.)
static
pravi metodu dostupnu bez instance
Program
. Svaka konzolne aplikacije metoda
Main
ulazna tačka mora biti deklarisana
static
(statičnom). U suprotnom, program bi zahtijevao instancu, ali bilo koja instanca zahtijeva program. Da se zaobiđe ta nerješiva kružna zavisnost, C# kompajleri koji procesiraju konzolne aplikacije (kao ova iznad) pokazuje grešku, ako nema
static Main
metode. Riječ
void
deklariše da
Main
nema vraćajuću vrijednost (return).
Console.WriteLine("Selam, svijete!");
Ova linija ispisuje izlaz.
Console
je statična klasa u
System
imenskom prostoru. Omogućava interfejs ka standardnom ulazu, izlaz, i tokove greške za konzolne aplikacije. Program poziva
Console
metodu
WriteLine
, koja prikazuje na konzoli liniju sa argumentom, string
"Selam, svijete!"
.
Grafički (GUI) primjer:
using System.Windows.Forms;
class Program
{
static void Main()
{
MessageBox.Show("Selam, svijete!");
}
}
Ovaj primjer je sličan prethodnom, osim što generiše dijaloški okvir koji sadrži poruku "Selam, svijete!" umjesto pisanja istog u konzoli.
U augustu 2000, Microsoft, Hewlett-Packard i Intel kosponzorirale su podnošenje specifikacija za C# kao i za Common Language Infrastructure (CLI) organizaciji za standardizaciju Ecma International. U decembru 2001, ECMA je izdala ECMA-334 C# Language Specification. C# je postao ISO standard u 2003. godini (ISO/IEC 23270:2003 - Information technology — Programming languages — C#). ECMA je prethodno usvojila ekvivalentne specifikacije kao 2. izdanje za C#, u decembru 2002.
U junu 2005, ECMA je odobrila izdanje 3 za C# specifikacije, i nadograđenu ECMA-334. Dodaci uključuju parcijalne klase, anonimne metode, nulabilne tipove, i generike (nešto slično C++ šablonima).
U julu 2005, ECMA je priložila standarde i vezane TRove za ISO/IEC JTC 1 preko ovog drugog Fast-Track procesa. Ovaj proces obično uzima 6–9 mjeseci.
Definicija C# jezika i CLI su standardizirani pod ISO i Ecma standardima koji pridaju zaštitu razložnog i nediskriminirajućeg licenciranja od tvrdnji patenta.
Microsoft se složio s tim da ne tuži razvojne programere otvorenog koda radi kršenja patenta u neprofitnim projektima za dio frameworka kojeg pokriva OSP.[41] Microsoft se je također složio da ne forsira patente vezane za Novell proizvode protiv plaćajućih korisnika Novella[42] sa izuzetkom na listu proizvoda koje eksplicitno ne spominju C#, .NET ili Novellove implementacije .NET-a (The Mono Project).[43]
Izvorni kompajler za C# je Microsoft Visual C#, koji je zatvorenog koda.
Microsoft vodi razvoj novog kompajlera otvorenog koda za C# i skup alata, prethodnog kodnog imena "Roslyn". Kompajler, koji je potpuno pisan u upravljanom kodu (C#), bio je otvoren i funkcionalno obrađen kao API. To omogućava razvojnim programerima kreiranje refaktoringa i dijagnostičke alate.
Ostali C# kompajleri postoje, često sadržavajući implementaciju CLI i .NET biblioteka klasa sve do .NET 2.0:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.