C Sharp

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 7 iunie 2021; verificările necesită 59 de modificări .
DIN#
Clasa de limba

multi- paradigma :
orientată pe obiecte ,
generică , procedurală , funcțională , bazată pe evenimente ,

reflectorizant
Aparut in 2001
Autor Anders Hejlsberg
Dezvoltator Fundația .NET
Extensie de fișier .cssau.csx
Eliberare 10.0 ( 8 noiembrie 2021 )
Versiune de testare 11 ( 22 februarie 2022 )
Tip sistem static , dinamic , strict , sigur , inferență de tip
Implementări majore .NET Framework , Mono , .NET , DotGNU (înghețat) , Universal Windows Platform
Dialectele , Spec# , C# polifonic , C# îmbunătățit
A fost influențat C++ , Java [1] [2] [3] , Delphi , Modula-3 și Smalltalk
influențat , F# , Nemerle , Vala , Windows PowerShell , Kotlin
Licență

Compilatorul Roslyn : licență MIT [4]
.NET Core CLR : licență MIT [5]

Compilator mono : dual GPLv3 și MIT/X11

DotGNU : dual GPL și LGPL
Site-ul web docs.microsoft.com/en-us…
Platformă Infrastructura limbajului comun
 Fișiere media la Wikimedia Commons

C# (pronunțat c sharp ) este un limbaj de programare orientat pe obiecte de uz general . A fost dezvoltat în 1998-2001 de un grup de ingineri Microsoft condus de Anders Hejlsberg și Scott Wilthaumot [6] ca limbaj de dezvoltare a aplicațiilor pentru platformele Microsoft .NET Framework și .NET Core . A fost ulterior standardizat ca ECMA -334 și ISO / IEC 23270.

C# aparține familiei de limbi cu sintaxă asemănătoare C , dintre care sintaxa sa este cea mai apropiată de C++ și Java . Limbajul este tipizat static , acceptă polimorfism , supraîncărcare operator (inclusiv operatori de distribuție expliciți și impliciti), delegați , atribute, evenimente , variabile , proprietăți , tipuri și metode generice , iteratoare , funcții anonime cu suport de închidere , LINQ , excepții , comentarii în XML format .

După ce a adoptat multe de la predecesorii săi - limbaje C++ , Delphi , Modula , Smalltalk și, în special, Java  - C#, bazându-se pe practica utilizării lor, exclude unele modele care s-au dovedit a fi problematice în dezvoltarea sistemelor software , de exemplu, C#, spre deosebire de C ++, nu acceptă moștenirea multiplă a claselor (între timp, este permisă implementarea multiplă a interfețelor ).

Caracteristicile limbii

C#‎ a fost conceput ca un limbaj de programare la nivel de aplicație pentru CLR și, ca atare, depinde în primul rând de capacitățile CLR însuși. Aceasta se referă, în primul rând, la sistemul de tip C#, care reflectă BCL . Prezența sau absența anumitor caracteristici ale limbajului expresiv este dictată de dacă o anumită caracteristică a limbajului poate fi tradusă în constructele CLR corespunzătoare. Deci, odată cu dezvoltarea CLR de la versiunea 1.1 la 2.0, C # în sine a fost îmbogățit semnificativ; interacțiuni similare ar trebui să fie așteptate în viitor (cu toate acestea, acest model a fost rupt odată cu lansarea C # 3.0, care este o extensie de limbaj care nu se bazează pe extensii ale platformei .NET). CLR oferă C#, ca toate celelalte limbaje orientate spre .NET , cu multe caracteristici de care lipsesc limbajele de programare „clasice”. De exemplu, colectarea gunoiului nu este implementată în C# în sine, ci este efectuată de CLR pentru programele scrise în C#, la fel cum se face pentru programele scrise în VB.NET , J# etc.

Numele limbii

Denumirea „Sharp” (din engleză sharp - sharp) provine de la notația muzicală alfabetică , unde litera latină C corespunde notei Do , iar semnul sharp (în engleză sharp) înseamnă o creștere a sunetului corespunzătoare notei prin un semiton [7] , care este similar cu numele limbajului C++ , unde "++" reprezintă increment variabil . Numele este, de asemenea, un joc în lanț CC++ → C++++(C#), deoarece simbolul „#” poate fi reprezentat ca fiind format din 4 semne „+” [8] .

Din cauza limitărilor tehnice de afișare (fonturi standard, browsere, etc.), precum și a faptului că semnul ascuțit ♯ nu este reprezentat pe o tastatură standard de computer , semnul lire sterline (#) este utilizat atunci când scrieți numele unui limbaj de programare [9] . Această convenție este reflectată în specificația limbajului C# ECMA-334 [10] . Cu toate acestea, în practică (de exemplu, atunci când face publicitate și design în cutie [11] ), Microsoft folosește semnul ascuțit.

Nu este obișnuită traducerea numelor limbajelor de programare, așa că limbajul se numește, folosind transcrierea, „C Sharp”.

Standardizare

C# este standardizat în ECMA (ECMA-334) [12] și ISO (ISO/IEC 23270) [13] .

Există cel puțin trei implementări independente ale C# bazate pe această specificație care se află în prezent în diferite stadii de dezvoltare:

Versiuni

În timpul dezvoltării limbajului C#, au fost lansate mai multe versiuni ale acestuia:

Versiune Specificarea limbii data .NET Studio vizual
ECMA ISO/IEC Microsoft
C# 1.0 decembrie 2002 aprilie 2003  (link indisponibil) ianuarie 2002 ianuarie 2002 .NET Framework 1.0 Visual Studio .NET (2002)
C# 1.1
C# 1.2
octombrie 2003 aprilie 2003 .NET Framework 1.1 Visual Studio .NET 2003
C# 2.0 iunie 2006 septembrie 2006 septembrie 2005 [14] noiembrie 2005 .NET Framework 2.0
.NET Framework 3.0
Visual Studio 2005
C# 3.0 Lipsă [15] august 2007 noiembrie 2007 .NET Framework 2.0 (excluzând LINQ )
.NET Framework 3.0 (excluzând LINQ )
.NET Framework 3.5
Visual Studio 2008
C# 4.0 aprilie 2010 aprilie 2010 .NET Framework 4.0 Visual Studio 2010
C# 5.0 decembrie 2017 decembrie 2018 Iunie 2013 august 2012 .NET Framework 4.5 Visual Studio 2012
C# 6.0 Dispărut iulie 2015 .NET Framework 4.6
.NET Core 1.0
.NET Core 1.1
Visual Studio 2015
C# 7.0 martie 2017 .NET Framework 4.6.2
.NET Framework 4.7
Visual Studio 2017 15.0
C# 7.1 august 2017 .NET Core 2.0 Visual Studio 2017 15.3
C# 7.2 noiembrie 2017 Visual Studio 2017 15.5
C# 7.3 mai 2018 .NET Core 2.1
.NET Core 2.2
.NET Framework 4.8
Visual Studio 2017 15.7
C# 8.0 septembrie 2019 .NET Core 3.0
.NET Core 3.1
.NET Framework 4.8
Visual Studio 2019 16.3
C# 9.0 septembrie 2020 .NET 5.0 Visual Studio 2019 16.8
C# 10.0 iulie 2021 .NET 6.0 Visual Studio 2022 17.0
Informații generale despre versiuni
Versiune Inovații
C# 2.0
  • Tipuri parțiale
  • Tipuri generice ( generice )
  • Iteratorii și cuvântul cheieyield
  • Metode anonime
  • operator null -union
  • Tipuri nullabile
C# 3.0
  • Interogări integrate de limbă ( LINQ )
  • Inițializatori de obiecte și colecții
  • Expresii Lambda
  • Arbori de expresie
  • Tastarea implicită și cuvântul cheievar
  • Tipuri anonime
  • Metode de extindere
  • Proprietăți automate
C# 4.0
  • Conectarea dinamică și cuvântul cheiedynamic
  • Argumente denumite și opționale
  • Covarianța și contravarianța generalizate
  • Biblioteca TPL , Conceptul sarcinii și clasele Task,Parallel
  • ClasăMemoryCache
  • Clasele de colectare paralele
C# 5.0
  • Șablon TAP
  • metode asincrone asyncşiawait
  • Informații despre apelant
C# 6.0
  • Compilatorul ca serviciu
  • Importarea membrilor de tipuri statice într-un spațiu de nume
  • Filtre de excepție
  • awaitîn blocuri catch/finally
  • Inițializatoare de proprietate auto
  • Proprietăți automate numai pentru citire
  • operații nul -condiționale ( ?.și ?[])
  • Interpolarea șirurilor
  • Operatornameof
  • Dicţionar initializer
  • Funcții reduse la expresii
C# 7.0 [16]
  • out-variabile
  • Potrivire de model
  • Șabloane cuis
  • Modele și expresieswitch
  • Tupluri
  • Dezambalarea tuplurilor (deconstructori)
  • Funcții locale
  • Îmbunătățiri literale
  • Variabile locale și valori returnate prin referință
  • Extinderea listei de tipuri returnate prin metode asincrone
  • Mai mulți membri ai clasei ca expresii
  • throwexpresii
C# 8.0
  • Membrii numai pentru citire
  • Membrii interfeței implicite
  • Îmbunătățiri de potrivire a modelelor
  • folosind declarații
  • Funcții locale statice
  • Structuri de referință detașabile
  • Tipuri de referință nullabile
  • Fire asincrone
  • Indici și intervale
  • Atribuire de sindicat NULL
  • Tipuri construite negestionate
  • Expresii Stackalloc în expresii imbricate
  • Mai mulți membri ai clasei ca expresii
  • Îmbunătățiri de șiruri interpolate
C# 9.0
  • operator de unire nulă (??)
  • Parametri goli pentru expresiile lambda
  • Native Int: nint, nuint
  • unire disjunctă
  • with-expresii adăugate
  • modificator nouinitonly
C# 10.0
  • Adăugarea role="alert"atributelor mesajului
  • Actualizări ale componentelor Counterde adăugatrole="status"
  • Înlocuirea ul într-o NavBarcomponentă pentrunav
  • Nume nou butonul de comutareNavBar
  • Treceți la un marcaj mai semantic

Versiunea 1.0

Proiectul C# a fost început în decembrie 1998 și a primit numele de cod COOL (C-style Object Oriented Language). Versiunea 1.0 a fost anunțată cu platforma .NET în iunie 2000, în același an cu prima versiune beta publică ; C# 1.0 a fost lansat în sfârșit cu Microsoft Visual Studio .NET în februarie 2002 .

Prima versiune de C# semăna cu Java 1.4 în ceea ce privește capacitățile sale, extinzându-le oarecum: de exemplu, C# avea proprietăți (care arătau ca câmpuri obiect din cod , dar de fapt numite metode de clasă atunci când sunt accesate), indexatori (asemănătoare proprietăților, dar luând un parametru ca o matrice de index), evenimente , delegați , bucle , structuri transmise după valoare, conversie automată a tipurilor încorporate în obiecte dacă este necesar ( boxing ), atribute, mijloace încorporate de interacțiune cu cod negestionat ( DLL , COM ) și altele. foreach

În plus, s-a decis portarea unor caracteristici C++ în C# care erau absente în Java: tipuri nesemnate, supraîncărcare operator (cu unele restricții, spre deosebire de C++ ), trecerea parametrilor unei metode prin referință , metode cu un număr variabil de parametri, operator goto(cu restricții). De asemenea, în C#, au lăsat o capacitate limitată de a lucra cu pointeri  - în locurile de cod special indicate de cuvânt unsafeși atunci când specificau o opțiune specială pentru compilator .

Versiunea 2.0

Proiectul de specificație C# 2.0 a fost publicat pentru prima dată de Microsoft în octombrie 2003 ; în 2004 au existat lansări beta (proiect cu numele de cod Whidbey), C# 2.0 a fost lansat în sfârșit pe 7 noiembrie 2005 împreună cu Visual Studio 2005 și .NET 2.0.

Caracteristici noi în versiunea 2.0

Versiunea 3.0

În iunie 2004, Anders Hejlsberg a vorbit pentru prima dată pe site-ul Microsoft despre extensiile de limbaj planificat în C#3.0 [18] . Septembrie 2005 a fost lansată versiunea preliminară a specificației C# 3.0 și versiunea beta a C# 3.0, care este instalată ca supliment pentru Visual Studio 2005 și .NET 2.0 existente. Această versiune a limbajului a fost în cele din urmă inclusă în Visual Studio 2008 și .NET 3.5.

Caracteristici noi în versiunea 3.0

C# 3.0 a introdus următoarele completări radicale la limbaj:

Client c = client nou (); c . Nume = "James" ; c . Varsta = 30 ; poate fi scris ca Client c = client nou { Nume = „James” , Vârsta = 30 }; listOfFoo . Unde ( delegat ( Foo x ) { return x . size > 10 ; }); acum poate fi scris ca listOfFoo . Unde ( x => x . dimensiune > 10 );
  • Arbori de expresie:
Expresiile lambda pot fi acum reprezentate ca o structură de date care poate fi parcursă în timpul execuției, permițând astfel ca expresiile C# puternic tipizate să fie traduse în alte domenii (cum ar fi expresiile SQL).
  • Tastarea implicită: deducerea tipurilor unei variabile locale. Pentru tastarea implicită , cuvântul cheie este folosit în locul numelui tipului de datevar . Apoi, în timpul compilării, compilatorul însuși deduce tipul de date pe baza valorii atribuite: var x = "hello";în loc destring x = "hello";
  • Tipuri anonime:var x = new { Name = "James" };
  • Metode de extindere. Acum puteți adăuga metode noi la clasele existente. Implementat folosind un cuvânt cheie thisîn primul parametru al unei funcții statice a unei clase statice.
public static class StringExtensions { public static int ToInt32 ( acest șir val ) { return Int32 . parse ( val ); } } // ... șir s = "10" ; int x = s . ToInt32 ();
  • Proprietăți automate: compilatorul va genera un câmp privat ( privat ) și accesoriul și mutatorul corespunzător pentru codul formularului
șir public Nume { get ; set privat ; }

C# 3.0 este compatibil cu C# 2.0 în codul generat MSIL ; îmbunătățirile în limbaj sunt pur sintactice și sunt implementate în etapa de compilare. De exemplu, multe dintre interogările LINQ integrate pot fi efectuate folosind delegați anonimi combinați cu metode predicate pe containere precum List.FindAllși List.RemoveAll.

Versiunea 4.0

O previzualizare a C# 4.0 a fost lansată la sfârșitul anului 2008, împreună cu o versiune CTP a Visual Studio 2010.

Visual Basic 10.0 și C# 4.0 au fost lansate în aprilie 2010, alături de lansarea Visual Studio 2010.

Caracteristici noi în versiunea 4.0 [19]
  • Abilitatea de a utiliza legarea tardivă, de a utiliza:
    • cu limbaje tastate dinamic ( Python , Ruby )
    • cu obiecte COM
    • reflecţie
    • obiecte cu structură mutabilă (DOM). Apare cuvântul cheie dynamic.
  • Parametri denumiți și opționali
  • Ce este nou în interoperabilitatea COM
  • Covarianța și contravarianța interfețelor generice și a delegaților
  • Contracte de cod
  • TPL Task Parallel Library , Task Concept and Classs Task, TaskFactory,Parallel
  • S-a adăugat o clasă MemoryCachecare este concepută pentru stocarea în cache a conținutului. Este similar cu o Cacheclasă ASP.NET, dar poate fi folosit atunci când scrieți aplicații web/grafică/ consolă .
  • S-au adăugat spațiul de nume System.Collections.Concurrent și noi clase de colecție simultană ( ConcurrentQueue , ConcurrentStack , ConcurrentBag ,...) care oferă nu numai mai multă eficiență, ci și o siguranță mai completă a firelor.

Exemple:

calc dinamic = GetCalculator (); intsum = calc . _ Se adaugă ( 10 , 20 ); // Apel dinamic public void SomeMethod ( int x , int y = 5 , int z = 7 ); // Parametri opționali

Versiunea 5.0

Caracteristici noi în versiunea 5.0

  • TAP (Task-based Asynchronous Pattern). TAP folosește o metodă pentru a reprezenta inițializarea și finalizarea unei operații asincrone.
  • Metode asincrone ( asyncși await) - ca o implementare a modelului TAP.
  • Informații despre apelant

Versiunea 6.0

Caracteristici noi în versiunea 6.0

  • declarații nule -condiționale. S- au adăugat noi operatori: ?.și ?[]:
int? lungime = clienti ?. lungime ; // null dacă clienții este nul Clientul întâi = clienții ?[ 0 ]; // null dacă clienții este nul
  • Funcții comprimate în expresii ( funcții cu corp de expresie ). Acum, definiția metodei poate fi dată folosind sintaxa lambda:
public Point Move ( int dx , int dy ) => punct nou ( x + dx , y + dy );
  • Inițializatoare de proprietăți automate. Proprietățile automate pot fi acum inițializate la declarația:
public string First { get ; set ; } = „Jane” ;
  • Proprietăți automate numai pentru citire. Proprietățile automate pot fi acum declarate fără setări:
public string First { get ; } = „Jane” ;
  • Inițializatoare de index. Acum puteți inițializa nu numai obiecte și colecții, ci și dicționare:
var numere = nou Dicționar < int , șir > { [7] = "șapte" , [9] = "nouă" , [13] = "treisprezece" };
  • Interpolarea șirurilor . În loc să folosiți constructe cu String.Format(), de exemplu:
var s = String . Format ( "{0} are {1} ani{{s}}" , p . Nume , p . Vârsta );

acum puteți plasa codul direct pe linia:

var s = $"{p.Name} are {p.Age} ani{{s}} vechi" ;
  • Filtre de excepție. Acum puteți seta condiții pentru blocuri catch:
încercați { } catch ( Excepție e ) când ( Jurnal ( e )) { }
  • Importul funcțiilor de tip static. Acum, accesul la membrii statici ai tipurilor este posibil fără a specifica numele complet al acestor membri:
folosind sistemul static . Consolă ; folosind sistemul static . matematică ; class Program { static void Main () { WriteLine ( Sqrt ( 3 * 3 + 4 * 4 )); } }
  • operator nameof. Un nou operator care returnează o reprezentare șir compactă pentru tipul transmis ca argument:
WriteLine ( numele ( persoana . Adresa . Codul postal )); // afișează „ZipCode”
  • Pentru programarea asincronă , a fost adăugată posibilitatea de a utiliza operatori awaitîn interiorul blocurilor :catchfinally
resursa res = null ; încercați { res = așteptați Resursa . OpenAsync ( ... ); // Ai putea face asta. } catch ( ResourceException e ) { await Resource . LogAsync ( res , e ); // Acum puteți face asta... } în cele din urmă { if ( res != null ) await res . CloseAsync (); // … și asta. }

Versiunea 7.0

Caracteristici noi în versiunea 7.0 [16]

  • out-variabile care vă permit să declarați variabile imediat într-un apel de metodă (mai mult, domeniul de aplicare pentru astfel de variabile este blocul exterior):
p . GetCoordonate ( out int x , out int y );
  • Potrivire de model. Se introduce conceptul de șablon ( pattern), care este o construcție sintactică care vă permite să verificați conformitatea unei variabile cu o anumită formă și să extrageți informații din aceasta.
  • Șabloanele cu is( ispot fi folosite acum nu numai cu un tip, ci și cu un șablon - ca argument potrivit)
  • Modele și expresie switch. Cazurile de utilizare au switchfost extinse, acum puteți:
    • utilizați orice tipuri (nu doar primitive);
    • utilizați modele în expresii case;
    • adăugați condiții suplimentare la expresii case(folosind cuvântul cheie when).
  • Tupluri. Tip de tuplu cu valoare adăugată (struct ValueTuple) și sintaxă pentru lucrul cu date de acest tip:
( șir , șir , șir ) LookupName ( long id ) // tipul de returnare este un tuplu { ... // inițializează returnarea datelor ( primul , mijlocul , ultimul ); // tuplu literal }
  • Despachetarea tuplurilor . O nouă construcție de sintaxă , deconstructor , a fost adăugată pentru a prelua un tuplu de membri ai clasei.
  • funcții locale. Acum, o funcție care este utilizată numai în corpul unei metode poate fi declarată direct în corpul acestei metode.
  • Îmbunătățiri literale. Au fost adăugate literale binare și caracterul delimitator ( _) în literalele numerice .
  • Variabile locale și valori returnate prin referință. Funcționalitatea cuvântului cheie a fost extinsă ref. Acum puteți returna date din metodă sau le puteți stoca într-o variabilă locală prin referință.
  • Extinderea listei de tipuri returnate prin metode asincrone
  • Mai mulți membri ai clasei ca expresii. Sintaxa funcției condensată la expresii ( expression-bodied functions) se aplică acum setterilor, getterelor, constructorilor și destructorilor.
  • throw-expresii. Poate fi folosit acum throwîn funcții condensate în expresii ( expression-bodied functions):
șir public GetLastName () => aruncă o nouă excepție NotImplementedException ();


Versiunea 8.0

Caracteristici noi în versiunea 8.0 [20]

  • Modificator readonly. A fost creat pentru a desemna un membru care nu va schimba starea.
  • Metode de interfață în mod implicit. Acum, când creați o metodă de interfață, puteți declara implementarea implicită a acesteia, care poate fi suprascrisă în clasa care implementează această interfață.
  • Potrivire de model. Caracteristica vă permite să lucrați cu șabloane în funcție de format în tipuri de date înrudite, dar diferite.
    • modele recursive. Este o expresie șablon care este aplicată rezultatelor unei alte expresii șablon.
    • Declarațiile Switch vă permit să reduceți numărul de cazuri și pauze, precum și acoladele.public enum Curcubeu { Roșu , Portocaliu , Galben , Verde , Albastru , Indigo , Violet } public static RGBColor FromRainbow ( Rainbow colorBand ) => comutator colorBand { Rainbow . Roșu => culoare RGB nouă ( 0 xFF , 0 x00 , 0 x00 ) , Curcubeu . Orange => noua culoare RGB ( 0 xFF , 0 x7F , 0 x00 ), Curcubeu . Galben => noua culoare RGB ( 0 xFF , 0 xFF , 0 x00 ) , Curcubeu . Verde => noua culoare RGB ( 0 x00 , 0 xFF , 0 x00 ) , Curcubeu . Albastru => noua culoare RGB ( 0 x00 , 0 x00 , 0 xFF ), Curcubeu . Indigo => noua culoare RGB ( 0 x4B , 0 x00 , 0 x82 ), Curcubeu . Violet => new RGBColor ( 0 x94 , 0 x00 , 0 xD3 ), _ => lansează noua ArgumentException ( mesaj : „valoare enumerare invalidă” , ​​paramName : nameof ( colorBand )), };
    • Șabloane de proprietate. Vă permite să comparați proprietățile obiectului studiat folosind { variable : value } => ....
    • Șabloane de tuplu. Folosit atunci când trebuie să lucrați cu mai multe intrări.(value1, value2,..) => ...
  • Anuntul using. Aceasta este o declarație de variabilă precedată de cuvântul cheie using. Îi spune compilatorului că variabila care este declarată ar trebui eliminată la sfârșitul domeniului .
  • Metoda locală statică. Acum vă puteți asigura că metoda nu acoperă nicio variabilă din domeniul de aplicare adăugând modificatorul la aceasta static.
  • Structurile de referință care trebuie îndepărtate. Structurile de referință nu pot implementa IDisposable(la fel ca orice alte interfețe). Prin urmare, pentru a elimina ref struct, aveți nevoie de un void Dispose().
  • Tipuri de valori care acceptă o valoare null. Acum, pentru a indica faptul că o variabilă de tip valoare acceptă o valoare null, trebuie să prefixați numele tipului cu?
  • fire asincrone. În primul rând, este o interfață IAsyncEnumerable<T>. Și în al doilea rând, construcția foreachcu await. Sistem public asincron static . colectii . Generic . IAsyncEnumerable < int > GenerateSequence () { for ( int i = 0 ; i < 20 ; i ++) { await Task . întârziere ( 100 ); randamentul randamentului i ; } } // sau așteptați pentru fiecare ( număr var în GenerateSequence ()) { Consolă . WriteLine ( număr ); }
  • Tipuri de lansări asincrone. Începând cu C# 8.0, limbajul acceptă tipuri eliberate asincrone care implementează System.IAsyncDisposable. Operandul unei expresii usingpoate implementa IDisposablesau IAsyncDisposable. În cazul în care, IAsyncDisposablecompilatorul generează cod pentru awaitfișierul returnat Taskde la IAsyncDisposable.DisposeAsync.
  • Indici și intervale. Intervalele și indicii oferă o sintaxă concisă pentru accesarea elementelor sau intervalelor individuale dintr-o secvență. Inovația include operatorii ^și .., precum și System.IndexșiSystem.Range
  • operator de atribuire a sindicatului nul. Operatorul ??=poate fi folosit pentru a atribui valoarea operandului din dreapta operandului din stânga numai dacă operandul din stânga evaluează la null.Lista < int > numere = null ; int? i = nul ; numere ??= listă nouă < int >(); numere . Se adaugă ( i ??= 17 ); numere . Se adaugă ( i ??= 20 ); Consola . WriteLine ( șir . Join ( " " , numere )); // ieșire: 17 17 Consolă . WriteLine ( i ); // ieșire: 17
  • Tipuri construite negestionate. Începând cu C# 8.0, un tip de valoare construit este negestionat dacă conține câmpuri de tipuri exclusiv negestionate (de exemplu, tipul generic <T>).
  • Expresia stackalloc în expresii imbricate. Acum, dacă rezultatul expresiei stackalloc este de tip System.Span<T>sau System.ReadOnlySpan<T>, atunci poate fi folosit în alte expresii.Span < int > numere = stackalloc [] { 1 , 2 , 3 , 4 , 5 , 6 }; var ind = numere . IndexOfAny ( stackalloc [] { 2 , 4 , 6 , 8 }); Consola . WriteLine ( ind ); // ieșire: 1
  • Ordinea markerilor $și @în șiruri textuale interpolate poate fi acum orice.


Exemplu „Bună lume!”

Mai jos este codul pentru programul clasic „ Hello world ” în C# pentru o aplicație de consolă:

Consola . WriteLine ( "Bună lume!" ); // Trimite textul dat în consolă Consola . ReadKey (); // Așteptați ca utilizatorul să apese o tastă

și codul aceluiași program pentru o aplicație Windows Forms:

spatiu de nume WindowsForms ; Programul de clasă publică { [STATthread] public static void Main () => nou DemoForm (). ShowDialog (); } clasă publică DemoForm : Form { Label label = etichetă nouă (); DemoForm public () { eticheta . Text = „Bună lume!” ; aceasta . Controale . Adăugați ( etichetă ); aceasta . StartPosition = FormStartPosition . CenterScreen ; aceasta . BackColor = Culoare . alb ; aceasta . FormBorderStyle = FormBorderStyle . Fix 3D ; } }

Implementări

Există mai multe implementări C#:

Note

  1. „Pentru că limbajul C# și-a moștenit sintaxa din C++ și Java...” Trey Nash. C # 2010: un curs accelerat pentru profesioniști = Accelerated C # 2010. - M . : Williams, 2010. - P.  17 . — 592 p. — ISBN 978-5-8459-1638-9 .
  2. „Limbajul C# <...> a moștenit multe caracteristici utile din alte limbaje de programare și este direct legat de cele două limbaje de calculator cele mai utilizate pe scară largă din lume - C și C++, precum și de Limbajul Java” , dar mai departe: „Conexiunea dintre C# și Java este mai complexă. Ambele limbaje sunt concepute pentru a crea cod portabil, bazat pe C și C++, folosind sintaxa și modelul obiect. Cu toate acestea, nu există o legătură directă între aceste limbi, ele seamănă mai mult cu veri, având strămoși comuni, dar diferă în multe privințe” Herbert Schildt . Tutorial C# = C#. Un ghid pentru începători. - M .: Piter , 2003. - S. 20. - ISBN 966-552-121-7 .
  3. Herbert Schildt . Referința completă pentru C# = C#: Referința completă. - M . : Editura „Williams”, 2004. - S.  26 -27. — 752 p. — ISBN 5-8459-0563-X .
  4. Licență (Roslyn) pe depozitul Github . Preluat la 4 ianuarie 2022. Arhivat din original la 4 ianuarie 2022.
  5. Licență (.NET CLR) pe depozitul Github . Preluat la 4 ianuarie 2022. Arhivat din original la 4 ianuarie 2022.
  6. Liberty D. Limbajul de programare C # // Programare C# . - St.Petersburg. - 2003: Simbol-Plus, 2003. - S.  26 . — 688 p. — ISBN 5-93286-038-3 .
  7. Kovacs, James C#/.NET History Lesson  ( 7 septembrie 2007). Preluat la 23 martie 2011. Arhivat din original la 21 august 2011.
  8. AZ a limbajelor de programare: C#  (engleză)  (link nu este disponibil) . computerworld.com.au (1 octombrie 2008). Preluat la 2 septembrie 2014. Arhivat din original la 2 aprilie 2015.
  9. Întrebări frecvente Microsoft C# (link descendent) . Microsoft . Consultat la 25 martie 2008. Arhivat din original la 30 aprilie 2003. 
  10. Specificația limbajului C#  (nedefinită) . — al 4-lea. - Ecma International , 2006. Copie arhivată (link nu este disponibil) . Data accesului: 26 ianuarie 2011. Arhivat din original pe 2 decembrie 2012. 
  11. Visual C# .net Standard (JPEG). Microsoft (4 septembrie 2003). Consultat la 18 iunie 2009. Arhivat din original pe 21 august 2011.
  12. Standard ECMA-334 C# Language Specification, a patra  ediție . Ecma International (iunie 2006). Preluat la 16 mai 2017. Arhivat din original la 31 octombrie 2010.
  13. ISO/IEC 23270:2003 Tehnologia informației --  Specificația limbajului C# . Organizația Internațională pentru Standardizare (aprilie 2003). Preluat la 16 mai 2017. Arhivat din original la 5 august 2017.
  14. Specificația pentru Microsoft C# 2.0 conține o descriere doar a noilor caracteristici ale versiunii 2.0. Specificațiile versiunii sunt descrise în specificația 1.2 de mai sus.
  15. Versiunile de limbaj C# 3.0, 4.0 și 5.0 nu au încă specificații aprobate ECMA sau ISO/IEC.
  16. 12 Mads Torgersen . Caracteristici noi în C# 7.0 . Blog .NET . Microsoft (9 martie 2017). Preluat la 7 mai 2017. Arhivat din original la 11 aprilie 2017.  
  17. Diferențele dintre șabloanele C++ și genericele C# (Ghid de programare C#  ) . Microsoft (17 decembrie 2016). Preluat la 16 mai 2017. Arhivat din original la 7 august 2021.
  18. Anders Hejlsberg - Programarea datelor în C#  3.0 . Echipa Channel 9 . Microsoft (16 iunie 2004). Preluat la 16 mai 2017. Arhivat din original la 12 noiembrie 2018.
  19. Visual Studio 2010: Exemple pentru C# 4.0 . Microsoft (17 iulie 2012). Preluat la 16 mai 2017. Arhivat din original la 28 februarie 2017.
  20. Caracteristici noi în C# 8.0 . docs.microsoft.com. Preluat la 11 iunie 2020. Arhivat din original la 8 august 2020.
  21. Dot Net Oriunde . Consultat la 5 martie 2009. Arhivat din original la 4 mai 2009.

Literatură

  • John Skeet. C# pentru profesioniști: subtilități ale programării, ediția a III-a, traducere nouă = C# în profunzime, ed. a III-a.. - M . : "Williams" , 2014. - 608 p. - ISBN 978-5-8459-1909-0 .
  • Christian Nagel și colaboratorii C# 5.0 și .NET 4.5 pentru profesioniști = Professional C# 5.0 și .NET 4.5. - M . : „Dialectică” , 2013. - 1440 p. - ISBN 978-5-8459-1850-5 .
  • A. Hejlsberg, M. Torgersen, S. Wiltamuth, P. Gold. Limbajul de programare C#. Informatica clasica. Ediția a 4-a = Limbajul de programare C# (acoperă C# 4.0), Ed. a 4-a. - Sankt Petersburg. : „Petru” , 2012. - 784 p. - ISBN 978-5-459-00283-6 . Arhivat pe 10 octombrie 2011 la Wayback Machine
  • E. Stillman, J. Green. Învățarea C#. Ediția a 2-a = Head First C#, 2ed. - Sankt Petersburg. : „Piter” , 2012. - 704 p. - ISBN 978-5-4461-0105-4 .  (link indisponibil)
  • Andrew Troelsen. C# 5.0 și .NET 4.5 Framework, ediția a 6-a = Pro C# 5.0 și .NET 4.5 Framework, ediția a 6-a. - M . : „Williams” , 2013. - 1312 p. — ISBN 978-5-8459-1814-7 .
  • Joseph Albahari, Ben Albahari. C# 6.0. Director. Descriere completă a limbajului = C# 6.0 pe scurt: Referința definitivă. - M. : „Williams” , 2018. - 1040 p. - ISBN 978-5-8459-2087-4 . — ISBN 978-1-491-92706-9 .
  • Herbert Schildt. C# 4.0: Referința completă = C# 4.0 Referința completă. - M .: „Williams” , 2010. - S. 1056. - ISBN 978-5-8459-1684-6 .
  • Christian Nagel, Carly Watson și colab. Visual C # 2010: curs complet = Beginning Microsoft Visual C # 2010. - M . : Dialectics , 2010. - ISBN 978-5-8459-1699-0 .

Link -uri