Tā ir moderna, objektorientēta un tipu droša programmēšanas valoda. Galvenie raksturojošie lielumi ir objekti, iekapsulēšana, iedzimtība, polimorfisms un atkalizmantojamība. C# ļauj izstrādātājiem veidot drošas un stabilas lietojumprogrammas, kas darbojas .NET vidē.
.NET ir bezmaksas, daudzplatformu atvērtā koda izstrādātāju platforma, kas paredzēta dažādu veidu lietojumprogrammu izveidei. Izmantojot .NET, iespējams lietot vairākas valodas, redaktorus un bibliotēkas, lai veidotu tīmekļa, mākoņa, mobilās, darbvirsmas, spēļu un lietu interneta lietojumprogrammas. C# nav vienīgā .Net valoda - bez tās ir arī F# and Visual Basic.
Neatkarīgi no tā, vai strādā C#, F# vai Visual Basic, Tavs kods darbosies dabiski jebkurā saderīgā operētājsistēmā, pateicoties dažādām .NET implementācijām:
C# tiek uzskatīta par draudzīgu valodu programmēšanas iesācējiem, jo tā ir vieglāka par Java, bet tajā pašā laikā Python ir vieglāks par C#. Par draudzīgu iesācējiem to padara arī statiskums - tas nozīmē, ka uzreiz ir iespējams novērst dažādas kļūdas izstrādes procā saistībā ar datu tipiem, kas nav tik viegli panākams citās valodās.
1999. gada janvārī holandiešu programmatūras inženieris Anderss Hejlsbergs izveidoja komandu iekš Microsoft, lai izstrādātu C# kā papildinājumu Microsoft NET sistēmai. Sākotnēji C# tika izstrādāta kā C tipa objektorientētā valoda ar nosaukumu Cool (C-like Object Oriented Language).
Pirms oficiālās debijas, 2001. gadā pasaulē divas izplatītākās programmēšanas valodas bija C++ un Java. C++ bija pazīstama ilgāk, un to novērtēja par tās spēju atbalstīt objektorientētu programmēšanu (datorprogrammēšanas modelis, kas programmatūras izstrādi organizē ap datiem jeb objektiem, nevis funkcijām un loģiku), vienlaikus saglabājot ļoti ātru veiktspēju. Tomēr tās izmantošana, lai izveidotu lietojumprogrammas, kas darbotos vairāk nekā vienā platformā, nebija visvieglāk paveicamā lieta.Tās sintakse, valodai attīstoties, šķita arvien sarežģītāka. No otras puses, Java salīdzinoši īsākā laika posmā bija ieguvusi diezgan lielu popularitāti. Un, lai gan agrāk ātra koda ģenerēšana nebija viena no tās stiprajām pusēm, to novērtēja par to, ka tā bija daudz ērtāk pārnesama starp platformām un, iespējams, produktīvāka sarežģītu, bet joprojām uzturējamu sistēmu veidošanā. Ņemot vērā iepriekš minēto, C# izstrādātāji centās radīt valodu, kas ietvertu labākās C++ un Java īpašības, vienlaikus uzlabojot abas valodas.
Viens no pirmajiem C# izstrādātāju uzdevumiem bija nodrošināt, lai tā būtu sintaktiski saprotama C++ un Java izstrādātājiem. Tas nozīmēja, ka C#, tāpat kā C++ un Java, piederēs C valodu saimei.
Atkritumu savākšana automātiski atgūst atmiņu, ko aizņem nesasniedzami neizmantoti objekti. Izņēmumu apstrāde nodrošina strukturētu un paplašināmu pieeju kļūdu atklāšanai un atjaunošanai. Lambda izteiksmes atbalsta funkcionālās programmēšanas metodes. Valodas integrētās vaicāšanas (LINQ - Language Integrated Query) sintakse rada vienotu modeli darbam ar datiem no jebkura avota. Valodas atbalsts asinhronām operācijām nodrošina sintaksi sadalītu sistēmu veidošanai.
Visi C# tipi, tostarp primitīvie tipi, piemēram, int un double, tiek mantoti no viena saknes objektu tipa. Visiem tipiem ir kopīgs kopīgu operāciju kopums. Jebkura tipa vērtības var uzglabāt, pārvietot un apstrādāt konsekventi. Turklāt C# atbalsta gan lietotāja definētus atsauču tipus, gan vērtību tipus. C# atbalsta vispārīgas metodes un tipus, kas nodrošina lielāku tipu drošību un veiktspēju. C# nodrošina iteratorus, kas ļauj kolekciju klašu īstenotājiem definēt klienta kodam pielāgotu uzvedību. Lai gan brīvi tipizētu valodu cienītāji uzskata, ka darbs ar stingri tipizētu valodu ir nedaudz apgrūtinošs, pūles atmaksājas, jo tiek novērstas kļūdas gan kompilēšanas laikā, gan izpildes laikā. Tomēr C# kompilators ļoti bieži spēj noteikt mainīgā vai parametra tipu, analizējot tā lietošanas kontekstu. C# valodā izstrādātāji signalizē, ka viņi vēlas, lai kompilators atvasina kaut kā tipu, izmantojot atslēgvārdu “var”, nevis norādot konkrētu tipu. Tieši dēļ tipiem, tiek uzskatīts, ka ir viegli un ātri uzrakstīt C# kodu.
C# ir stingri tipizēta, tai piemīt elastība pret izmaiņām un izpildes laika drošība, kas raksturīga brīvāk tipizētām dinamiskajām valodām, un statiski tipizēta, dabiski kompilēta koda veiktspējas īpašības.
C# ir pieejams kā atvērtā pirmkoda projekts un atbalsta starpplatformu konsoles lietotņu un tīmekļa lietotņu izstrādi, kas paredzētas operētājsistēmām Windows, macOS un Linux. C# ir diezgan universāls, un to var izmantot, lai veidotu visu, sākot no datora lietotnēm līdz mobilajām lietotnēm operētājsistēmām Android un iOS, tīmekļa lietotnēm un pat spēlēm.
Ir labi, ja kādam ir iemels rūpēties un nodrošināt valodas atjauninājumus un dokumentāciju. Par C# rūpējas Microsoft. Tā kā Microsoft ir liels un stabils uzņēmums - C# ir drošās rokās.
Objektorientētā programmēšana ir daudzu pašreizējo lietojumprogrammu izstrādes pieeju pamats. Tīra koda rakstīšanas pamatprincips ir sakārtot kodu atbilstošās klasēs, izmantojot objektorientētās programmēšanas metodes. Koda organizēšana atbilstošās klasēs palīdz kodam būt drošam, iteratīvam, elastīgam un testējamam. Dizaina paternu pamatā ir objektorientētas programmēšanas koncepcijas, kas nozīmē, ka ar C# ir vieglāk sekot kādam dizaina paternam un izveidot stabilu arhitektūru. Arī API (Application Programming Interface - lietojumprogrammēšanas saskarne) veidošanā ir svarīgi objektorientētas programmēšanas koncepti.
Atceries, ka objekti nav tas pats, kas klases!
Klase ir kods un tas sastāv no dažādiem objektiem, piemēram, ja klase saucas Account (konts), tad tās objekti ir informācija par kontu - klases dati, bet metodes - klases darbības un uzvedība, piemēram, iegūt konta datus. Klases pamatmērķis ir nodrošināt noteikta tipa objektu definīciju.
Šī klase definē Account tipa objektus, kas var izveidot dažādus kontus un veikt konkrētās darbības. Objekts ir klases gadījums. To izveido, izmantojot C# atslēgas vārdu new. Sintakse rada jaunu Account klases gadījumu un šis gadījums ir objekts. Šis mainīgais atsaucas uz izveidoto objektu, tāpēc to bieži sauc par objekta mainīgo. Objekts Account pārstāv konkrēta cilvēka kontu. Izmanto objekta mainīgo, lai iegūtu vai iestatītu jebkuru no klasē noteiktajām īpašībām. Objekta mainīgais glabā objekta stāvokli, t. i., tas saglabā tā īpašību vērtības, un izmanto objekta mainīgo, lai izsauktu jebkuru no klasē identificētajām metodēm. Šajā gadījumā metode ShowNameAndBalance tiek izsaukta šim konkrētajam Account objektam.
Kad lietojumprogramma tiek pabeigta, objekts vairs nepastāv. Jebkurš objekta stāvoklis ir zudis, ja vien tas nav saglabāts, piemēram, datubāzē, bet klase joprojām pastāv, jo tā ir definēta kodā.
Bieži vien tiek lietots termins entity (konkrēta lieta). Šis pats termins tiek lietots tajā pašā kontekstā un datubāzes dizainā, lai definētu lietas, kas ir pietiekami nozīmīgas, lai tās ņemtu vērā. Tas pats šeit. Jebkura lieta no reālās pasaules, kas ir pietiekami nozīmīga, lai to lietojumprogrammā attēlotu kā klasi, tiek saukta par vienību. Ņem vērā, ka šim termina entity lietojumam nav nekāda sakara ar Entity Framework, lai gan Entity Framework arī izmanto terminu entity, lai definētu nozīmīgas lietas. Saliekot kopā šos terminus, teiksim, ka mēs veidojam konta pārvaldības sistēmu. No sistēmas nosaukuma mēs varētu sagaidīt, ka konts (Account) būs vienība. Tā ir pietiekami svarīga, lai to uzskatītu par klasi. Pēc nelielas analīzes mēs nosakām, ka kontam patiešām jābūt klasei. Un tai ir vārda (Name) un konta atlikuma (Balance) īpašības, kā arī metode ShowNameAndBalance. Izpildot lietojumprogrammu, lietotājs var pieprasīt konta informāciju. Tādējādi lietojumprogramma var izveidot konta klases eksemplāru - accountOfBaiba. Šis objekts, kas izveidots no Account klases ir Account objekts - Account klases eksemplāri.
Ja katrai klasei ir atsevišķs mērķis, ir vieglāk rakstīt, testēt un vēlāk atrast šo klasi, lai to atjauninātu vai paplašinātu. Tādējādi kodu ir vieglāk modificēt un pielāgot nākotnes prasībām. Neviena klase nav sala. Neviena klase nav patstāvīga pati par sevi. Objektorientētā programmēšana ietver izpratni par attiecībām starp klasēm. Šīs attiecības nosaka, kā no šīm klasēm izveidotie objekti sadarbojas, lai veiktu lietojumprogrammas darbības. Viens no galvenajiem objektorientētās programmēšanas mērķiem ir atkārtota izmantošana. Ieguvis kopīgo starp klašu kopumu atsevišķā klasē, mūsu kods ir vairāk izmantojams atkārtoti.
C# tiek uzskatīta par modernu valodu, jo tā atbilst mūsdienu prasībām un vajadzībām. Ar to var izveidot vienkāršas, jaudīgas, mērogojamas, sadarbspējīgas un izturīgas lietojumprogrammas.
NuGet ir .NET pakešu pārvaldnieks. Tas ļauj izstrādātājiem izveidot, kopīgot un izmantot noderīgas .NET bibliotēkas. NuGet pakotne ir atsevišķs ZIP fails ar paplašinājumu .nupkg, kas satur kompilētu kodu (.dll failu), citus ar šo kodu saistītus failus un aprakstošu manifestu, kurā ietverts paketes versijas numurs. Izstrādātāji, kuriem ir koplietojams kods, izveido paketes un publicē tās publiskajā vai privātajā mitinātājā. Pakešu lietotāji saņem šīs paketes no piemērotiem mitinātājiem, pievieno tās saviem projektiem un pēc tam izsauc paketes funkcionalitāti savā projekta kodā. NuGet pats apstrādā visas starpposma detaļas. Paketes izveidošana nenozīmē, ka tas ir publiski pieejams kods visiem. Šīs paketes var tikt veidotas arī kāda konkrēta uzņēmuma vajadzībām un tikai iekšējai lietošanai.
C# programmas darbojas ar .NET virtuālo izpildes sistēmu, ko sauc par kopīgo valodas izpildes laiku (Common Language Runtime, CLR), un klašu bibliotēku kopumu. CLR ir starptautiskā standarta - kopīgās valodas infrastruktūras (Common Language Infrastructure, CLI) implementācija, ko īsteno Microsoft. CLI ir pamats izpildes un izstrādes vides izveidei, kurā valodas un bibliotēkas sadarbojas nevainojami.
C# valodā rakstītais kods tiek kompilēts starpvalodā (Intermediate Language, IL), kas atbilst CLI specifikācijai. IL kods un resursi, piemēram, bitmapes un virknes, tiek saglabāti asamblejā, parasti ar paplašinājumu .dll. Asambleja satur manifestu, kurā ir sniegta informācija par asamblejas tipiem, versiju un kultūru.
Kad tiek izpildīta C# programma, asambleja tiek ielādēta CLR. CLR veic kompilāciju tieši laikā (Just-In-Time, JIT), lai konvertētu IL kodu dzimtās mašīnas instrukcijās. CLR nodrošina citus pakalpojumus, kas saistīti ar automātisko atkritumu savākšanu, izņēmumu apstrādi un resursu pārvaldību.
Valodu savietojamība ir galvenā .NET iezīme. C# kompilatora izveidotais IL kods atbilst kopējai tipu specifikācijai (Common Type Specification, CTS). No C# ģenerētais IL kods var mijiedarboties ar kodu, kas ģenerēts no .NET versijām F#, Visual Basic, C++.
Papildu izpildes laika pakalpojumiem, .NET ietver arī plašas bibliotēkas. Tās ir sakārtotas “telpās pēc nosaukuma” (namespace), kas nodrošina dažādas noderīgas funkcijas. Bibliotēkas ietver visu, sākot no failu ievades un izvades līdz manipulācijām ar virknēm, XML analizēšanai, tīmekļa lietojumprogrammu ietvariem un beidzot ar Windows Forms kontrolēm. Tipiskā C# lietojumprogrammā tiek plaši izmantotas .NET klašu bibliotēkas.
C# jau ilgu laiku ir diezgan populārs un dažādās aptaujās par programmēšanas valodām, iegūst 5. - 8. vietu, piemēram, StackOverflow (https://insights.stackoverflow.com/survey/2021), Tiobe (https://www.tiobe.com/tiobe-index/), PopularitY of Programming Language (https://pypl.github.io/PYPL.html).
C# regulāri iznāk atjauninājumi un pašlaik jau ir pieejams C# 10 (https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10)
C# valodas uzturēšanā var aktīvi iesaistīties, kā arī sekot līdzi jauninājumu izstrādei iekš https://github.com/dotnet/csharplang.
C# ir diezgan plaša komūna, kā arī ir pieejami vairāki forumi (https://www.c-sharpcorner.com/, https://csharpforums.net/, https://dev.to/t/csharp,
Informāciju par trūkumiem nav tik viegli atrast, jo acīmredzot tādu ir maz, bet vērts pieminēt - C# ir pilnībā balstīta uz Microsoft .Net ietvaru, tāpēc šī nav elastīga valoda. Ar vecākiem projektiem var arī nebūt iespējams strādāt uz MacOs. Kā arī, ja mēs kaut ko mainām C# rakstītajā kodā, mums vispirms ir jāveic kompilācija.
Oficiālā C# dokumentācija ir pieejama https://docs.microsoft.com/en-us/dotnet/csharp/. Tev ir iespēja apgūt šo valodu pašam un izmantot CodeCademy zināšanu paplašināšanai (https://www.codecademy.com/courses/learn-c-sharp/lessons/csharp-hello-world/exercises/what-is-c-sharp ) Tā pat C# vari apgūt Codelex intesīvajos kursos.