C# se pri skladnji zgleduje po številnih drugih programskih jezikih, najbolj izrazito po C/C++ in javi. Jezik je bil skrbno načrtovan z namenom biti čim bolj preprosti in moderni ter uporabiti najboljše značilnosti drugih jezikov in popraviti pomanjkljivosti, ki so se pokazale v njih. Pomemben primer so generični tipi, katerih specifikacija je v C# bolj dodelana kot v javi, kar omogoča bolje optimizirano strojno kodo, večjo varnost pri definiciji tipov (lažje odkrivanje nekonsistentnosti v času prevajanja) ter striktno upoštevanje kovariančnosti in kontravariančnosti.[6][7]
C# je programski jezik, ki cilja na izvajalsko okolje CLI in s tem ogrodje .NET ter njegove različice kot je Mono. Zaradi tega se programi v C# izvajajo v posebnem izvajalskem okolju in se programska koda v tem jeziku šteje za upravljano kodo. Dele programov napisane v C# je zato enostavno povezovati z deli, ki so napisani v kateremkoli drugem programskem jeziku skladnem s CLI, z obstojem prenosljivih implementacij CLI (npr. Mono ali .NET Core) pa imajo programi napisani v C# tudi zelo dobro prenosljivost med različnimi platformami. Zaradi točne specifikacije programskega jezika in vmesnega jezika CIL, se lahko program napisan v C# neposredno prevede in izvede na drugih okoljih, ne da bi bilo treba za prenosljivost program spreminjati. C# je tudi prva izbira za razvijanje iger v igralnem pogonuUnity. Zaradi omenjenih značilnosti, jasne in dodelane skladnje, velike izraznosti (možnost uporabe različnih paradigem) je C# eden najbolj priljubljenih programskih jezikov.[8][9]
Včasih so tudi imeli maskoto Andy-ja imenovan po glavnem oblikovalcu Andersu Hejlsbergu, vendar so ga upokojili leta 2004.[10]
Imenovanje
Med razvojem so za programski jezik uporabljali kratico "Cool" (C-like Object Oriented Language), vendar so jo opustili zaradi marketinških razlogov, ter uporabili ime od prejšnjega nedokončanega projekta iz leta 1988, ki je imelo ime C#.
C# je dobilo navdih za svojo ime preko notnega zapisa, kjer višaj označi, da naj se ton za en polton zviša, podobno kakor v C++-u, kjer "++" označi, da naj se spremenljivka zviša za eno vrednost. Višaj je tudi po zgledu podoben skupku štirih plusov, dvakrat več kot jih ima C++, kar še bolj označi, da je nadgradnja njega. Izgovorjava imena je v angleščini tudi enakoglasnica izraza "see sharp", kar pomeni imeti bister pogled.
Ker se višaj ne pojavi na večini tipkovnic so se odločili uporabiti lojtro za približek temu, kakor je pa tudi zapisano v C# specifikaciji ECMA-334.
Končnica je zaradi tega tudi bila uporabljena v drugih programskih jezikih kakor programski jezik F#.
Glavna skladnja C#-a je zelo podobna skladnji C-ja, C++-a in Jave:
Konec stavka je označen s podpičjem ;.
Stavki so združeni skupaj v zavitih oklepajih { in }.
Spremenljivke dobijo vrednost preko enačaja =, zaradi tega je pa operator preverjanja enakosti dvojni enačaj ==.
Oglati oklepaji [] se uporabljajo pri tabelah v njihovi deklaraciji in za pridobitev vrednosti na določenem indeksu v njih.
Značilnosti
Podatkovni tipi
C# uporablja združeni sistem za tipizacijo, ki se imenuje Common Type System, kjer je določeno, da je vsak tip podrazred razreda System.Object.
Ta sistem razdeli tipe na dve glavni vrsti:[5]
Vrednostni tipi
Referenčni tipi
Vrednostni tipi neposredno vsebujejo podatek in so ponavadi alocirani na skladu.
V preverjanju enakosti se vrednostni tipi primerjajo po enakosti podatka.
Referenčni tipi shranjujejo referenco do podatka v pomnilniškem naslovu in so alocirani na kopici.
V preverjanju enakosti se referenčni tipi primerjajo po enakosti pomnilniškega naslova (razen, če so operatorji preobteženi kot v primeru System.String).
Zgled:
staticvoidMain(){// Primer vrednostnih tipov:intsrecna=7;doublezlatiRez=1.61;charvelikiC='C';booljeRes=true;// Primer referenčnih tipov:stringjezik="C#";int[]tabCelih=newint[10];objectmojObjekt=newobject();}
Generični tipi
Generični tipi so bili uvedeni v različici 2.0. Generični tipi uporabljajo tipske parametre, ki omogočajo načrtovanje razredov in metod, ki ne specifirajo natančno vseh uporabljenih tipov na ravni definicije, ampak se to zgodi šele pri instanciaciji razreda oziroma klicu metode, torej se lahko razred oziroma metoda pozneje uporabi kot kateregakoli tipa. Na nivoju generične definicije se na tip elementov sklicujemo s tipskim parametrom T.
Zgled:
// Deklaracija generičnega razreda določenega tipa, ki deluje kot// seznam elementov določenega tipa (tip elementov v tem trenutku ni znan)publicclassGeneričniList<T>{voidVnos(Tvnos){/* ... */}}classProgram{privateclassPrimerRazreda{}staticvoidMain(){// Deklaracija seznama celih števil:GeneričniList<int>listCelih=newGeneričniList<int>();// Deklaracija seznama nizov:GeneričniList<string>listNizov=newGeneričniList<string>();// Deklaracija seznama elementov tipa PrimerRazreda:GeneričniList<PrimerRazreda>listElementov=newGeneričniList<PrimerRazreda>();}}
Boxing in Unboxing
Boxing je operacija, ki pretvori vrednostni objekt v ustrezni referenčni objekt. Pri C#-u se to lahko zgodi implicitno, brez potrebe varne pretvorbe.
Unboxing je pa operacija, ki pretvori referenčni objekt v ustrezni vrednostni objekt. V tem primeru se pa to zgodi eksplicitno, torej potrebujemo varno pretvorbo.
↑Po dogovoru se uporablja kot drugi znak imena jezika znak '#' - znak za število, ASCII vrednost 35 (desetiško oz. 23 šestnajstiško), Unicode U+0023 oziroma HTML #. Gre za drug znak kot tisti, s katerim se označuje višaj v glasbi (npr. nota C♯ oz. Cis) in ima vrednost U+266F oziroma HTML ♯.
↑Microsoftova specifikacija C# 2.0 vsebuje le nove značilnosti raličice 2.0. Starejše značilnosti so vsebovane v specifikaciji 1.2 (zgoraj).
↑Za C# 3.0 in 4.0 ne obstajajo specifikacije ECMA ali ISO/IEC.
↑»Andy Retires«. Dan Fernandezov Blog. (angleščina) Blogs.msdn.com. 29. januar 2004. Arhivirano iz prvotnega dne 19. januarja 2012. Pridobljeno 4. oktobra 2012.{{navedi splet}}: Vzdrževanje CS1: bot: neznano stanje prvotnega URL-ja (povezava)