C ascuțit
C # limbaj de programare | |
---|---|
Autor | Anders Hejlsberg |
Data de origine | 2000 |
Ultima versiune | 9.0 |
Utilizare | Generic |
Paradigme | Multi-paradigmă: structurată , imperativă , orientată pe obiecte , funcțională , bazată pe evenimente |
Tastare | Static , dinamic , puternic , sigur |
Extensii comune | .cs, .csproj |
Influențată de | Delphi , C ++ , Java , Eiffel , Haskell , ML |
A influențat | D , F # , Java , TypeScript |
Implementare referință | |
Site-ul web | docs.microsoft.com/en-us/dotnet/csharp/ și docs.microsoft.com/de-de/dotnet/csharp/ |
C # (pronunția în engleză: [ˈsiː ˈʃɑːp] , la fel ca expresia vezi ascuțit , „vezi ascuțit”) [1] este un limbaj de programare multi-paradigmă care acceptă toate conceptele de programare orientată obiect. A fost dezvoltat de Microsoft ca parte a inițiativei .NET și ulterior aprobat ca standard de către ECMA (ECMA-334) și ISO ( ISO / IEC 23270 ).
Sintaxa și structura C # sunt inspirate din diferite limbaje născute anterior, în special Delphi , C ++ , Java și Visual Basic .
Istoria limbajului
Principalul designer al C # este Anders Hejlsberg , un informatician danez implicat anterior în dezvoltarea limbilor Turbo Pascal și Borland Delphi (deținute în prezent de Embarcadero).
Se crede în mod obișnuit că inspirația a venit din limbajul Java , deoarece chiar și creatorul său James Gosling , precum și Bill Joy de la Sun Microsystem, l-au numit o imitație a acestuia, dar mai limitat în ceea ce privește fiabilitatea, securitatea și productivitatea [2] . În schimb, conform lui Anders Hejlsberg și Microsoft însuși, structura lui C # este mai apropiată de cea a limbajului C ++ decât de Java [3] .
C # este strâns legat de dezvoltarea .NET Framework . De fapt, inginerii Microsoft au folosit în primele etape ale elaborării sale un cadru numit SMC sau Simple Managed C, un sistem care utilizează limbajul C într-un mod gestionat sau „gestionat”. În ianuarie 1999, Microsoft l-a pus pe Anders Hejlsberg în fruntea unui grup de lucru cu sarcina de a produce un nou limbaj, numit provizoriu „Cool”, un acronim pentru „C-like Object Oriented Language” [4] . Denumirea comercială definitivă a devenit C # la prezentarea oficială a Microsoft a proiectului .NET la Conferința dezvoltatorilor profesioniști din iulie 2000 la Orlando , când bibliotecile de clasă ale ASP.NET și timpul de rulare au fost, de asemenea, convertite în limbajul C #.
De-a lungul timpului, C # și Java au urmat căi diferite, crescând diferențele reciproce generale, deși au existat și cazuri evidente de schimb reciproc de caracteristici. De exemplu, C #, spre deosebire de Java, folosește reificarea de la versiunea 2 pentru a genera obiecte generice care pot fi folosite ca clase, rezervând compilația efectivă a codului atunci când se încarcă clasa în timpul rulării. Chiar și implementarea în ambele limbi a tipurilor generice , deși identică din punct de vedere conceptual, a fost implementată destul de diferit. În schimb, conceptul C # de box și unbox a fost ulterior implementat în Java [5] .
Versiunea C # 1.0, bazată pe .NET Framework 1.0, a fost lansată comercial de Microsoft în ianuarie 2002 cu pachetul de dezvoltare Visual Studio .NET 2002. Pachetele Microsoft Visual Studio . [6]
Versiunea C # | Data depunerii | Versiunea .NET | Studio vizual |
---|---|---|---|
1.0 | Ianuarie 2002 | 1.0 | Visual Studio .NET 2002 |
2.0 | Noiembrie 2005 | 2.0 | Visual Studio .NET 2003 |
3.0 | Noiembrie 2007 | 2.0 / 3.5 | Visual Studio 2008-2010 |
4.0 | Aprilie 2010 | 4.0 | Visual Studio 2010 |
5.0 | August 2012 | 4.5 | Visual Studio 2012-2013 |
6.0 | Iulie 2015 | 4.6 | Visual Studio 2015 |
7.0 | Martie 2017 | 4.6.2 | Visual Studio 2017 |
7.1 | August 2017 | 4.7 | Visual Studio 2017 Ver.15.3 |
7.2 | Noiembrie 2017 | 4.7.1 | Visual Studio 2017 Ver.15.5 |
7.3 | Mai 2018 | 4.7.2 | Visual Studio 2017 Ver.15.7 |
8.0 | Septembrie 2019 | 4.8 | Visual Studio 2019 |
9.0 | Septembrie 2020 | 5 | Visual Studio 2019 |
Caracteristicile limbajului
C # este, într-un anumit sens, limbajul care descrie cel mai bine liniile directoare pe care rulează fiecare program .NET . De fapt, a fost creat de Microsoft special pentru programarea în .NET Framework . Tipurile sale de date „primitive” se potrivesc în mod unic cu tipurile .NET și multe dintre abstracțiile sale, cum ar fi clasele , interfețele , delegații și excepțiile , sunt potrivite pentru gestionarea cadrului .NET .
Definirea în formă clasică C # ca limbă interpretată sau compilată în sensul clasic al termenilor este destul de complicată. De fapt, sunt ambele în același timp. Având în vedere integrarea sa strânsă cu .NET Framework, codurile sursă scrise în C # sunt compilate în mod normal în conformitate cu criteriile JIT . În practică, transformarea în cod mașină (adică efectuată direct de CPU ) se realizează numai atunci când programul este încărcat și executat. În primă instanță, codul sursă este convertit de cadru într-un cod intermediar numit CIL și numai la execuția programului, CLR specific pentru sistemul de operare utilizat convertește CIL în limbajul mașinii specifice pentru hardware-ul gazdă, pe măsură ce este executat . Aceasta înseamnă că execuția codului poate fi mai lentă la prima execuție și apoi poate deveni mai rapidă. Mai mult, optimizările progresive ale codului mașinii sunt de obicei realizate în timpul compilării în sine, producând astfel un cod mai rapid și teoretic „optim” executat numai după câteva execuții complete ale acestuia.
O a doua posibilitate este așa-numita compilație Ngen , care vă permite să convertiți tot codul CIL în cod mașină dintr-o singură dată. Acest lucru are avantajul de a permite ca mediile de dezvoltare care utilizează C # să fie implementate pe orice sistem de operare odată ce CLR-ul specific este implementat.
Sintaxa de bază a C # este adesea foarte similară sau identică cu cea a limbajelor C, C ++ și Java. Unele dintre caracteristicile de bază sunt:
- Numele variabilelor, funcțiilor, claselor și altor elemente sunt întotdeauna sensibile la majuscule.
- Fiecare specificație trebuie închisă cu caracterul punct și virgulă (;).
- Acoladele ({}) sunt utilizate pentru a grupa specificațiile.
- Conform obiceiurilor limbajelor orientate obiect, specificațiile sunt de obicei grupate în metode (adică funcții), metodele sunt grupate în clase și clasele sunt grupate în spații de nume .
Diferențe față de C și C ++
În comparație cu C sau C ++, limbajul C # are diverse modificări, în principal menite să evite erorile tipice și ambiguitățile programării în limbajul C :
- Pointerele pot fi utilizate numai în anumite blocuri de cod marcate ca nesigure .
- În multe operații aritmetice, deversările sunt verificate.
- Obiectele dinamice nu sunt dealocate în mod explicit, ci sunt tratate automat și implicit de către colectorul de gunoi atunci când nu mai există referințe la acele obiecte. Acest sistem evită cele două probleme ale indicatoarelor suspendate și ale scurgerilor de memorie , deși cu o reducere a performanței.
- La fel ca în Java, este posibil să moștenim dintr-o singură clasă, spre deosebire de C ++ , dar este posibil să implementăm un număr nedefinit de interfețe . Spre deosebire de C ++ , moștenirea de tip privat nu este permisă.
- Singurele conversii implicite permise sunt cele care sunt sigure , adică care nu expun riscul pierderii de date cauzat de diferitele tipuri de date. De exemplu, conversiile implicite între numere întregi și booleeni sau între enumeratoare și numere întregi nu sunt permise.
- C # nu are șablonul tipic al C ++ , dar în versiunea 2.0 au fost introduse generice.
Diferențe față de Java
Deși se crede că C # este similar cu Java , există câteva diferențe importante între cele două limbi. Cea mai vizibilă este cu siguranță prezența în C # a multor construcții, dintre care unele derivă în mod clar din C ++ , care au fost interzise în mod deliberat în Java . Susținătorii C # susțin că acest lucru face codul mai clar, în timp ce susținătorii Java spun că prezența unui număr mare de cuvinte cheie și reguli de reținut face limbajul mai dificil de învățat și de utilizat.
Alte diferențe vizibile sunt următoarele:
- Java folosește comentarii Javadoc-sintax pentru a genera documentație din codul sursă, în timp ce C # folosește sintaxa XML în comentarii în același scop.
- Ceea ce se numește pachet în Java se numește spațiu de nume sau „ nume ” în C #. Un nivel suplimentar de organizare în C # îl reprezintă asamblările , care pot conține mai multe spații de nume în ele.
- Java folosește un mod diferit de a invoca metodele constructorului unei clase, adică din prima linie a unui constructor invocă alta.
Funcții noi introduse cu versiunea 3 a limbii
- Expresii Lambda
- Tipuri anonime
- LINQ
- Metode de extindere
Funcții noi introduse cu versiunea 4 a limbii
- Pseudo tip dinamic
- Covarianță și controvarianță în tipurile de parametri pentru interfețe și delegați generici [7]
- Specificație de ref opțională pentru utilizarea COM
- Parametrii opționali și numele argumentelor
- Indexatori de proprietăți (recunoscuți, dar neutilizați de obiecte în C #)
Funcții noi introduse cu versiunea 5 a limbii [8]
- Metode asincrone
- Atribute Info apelant
Funcții noi introduse cu versiunea 6 a limbii [9]
- Serviciu compilator
- Importul membrilor de tip static în spațiul de nume
- Filtre de excepție
- Așteptați în blocuri de captură / în cele din urmă
- Inițializatoare automate de proprietăți
- Valori implicite pentru proprietățile de tip getter exclusiv
- Membri cu expresie
- Propagator nul
- Interpolarea șirurilor
- Numele operatorului
- Dicționar initializer
Funcții noi introduse cu versiunea 7 a limbii [10]
- Litere binare
- Deconstructori
- Separatoare de cifre
- Funcții locale
- Tipul comutatorului
- Ref return
- Numit tuplu
- Afară iese r
- Potrivire de model
- Reveniri asincrone arbitrare
- Înregistrări
- Obțineți și setați în definițiile expresiei
- Constructori și finalizatori în definițiile expresiei
Funcții noi introduse cu versiunea 8 a limbii [11]
- Tipuri de referință anulabile
- Membrii interfeței implicite
- Fluxuri asincrone
- Schimbați expresiile
- Funcții statice locale
- Membri struct numai în citire
- Îmbunătățirea șirurilor de cuvinte interpolate
- Înregistrări îmbunătățite
- Indici și intervale
- Sarcină nulă
Funcții noi introduse cu versiunea 9 a limbii [12]
- Afirmații de primul nivel
- Îmbunătățiri de potrivire a modelului
- I setează doar Init
- Numere întregi de dimensiuni native
- Indicatori de funcții
- Funcții statice anonime
- Parametrii deșeurilor Lambda
- Înregistrări îmbunătățite
- Atribute ale funcțiilor locale
- Funcții noi pentru metodele parțiale
Exemple
Salut Lume!
Următorul exemplu afișează textul „ Hello world ” pe consolă.
utilizarea sistemului ;
clasa HelloWorldApp
{
public static void Main ( șir [] args )
{
Consolă . WriteLine ( "Hello World" );
Consolă . ReadLine ();
}
}
În schimb, următorul exemplu tipărește textul „ Hello world ” într-o casetă de mesaje.
folosind System.Windows.Forms ;
clasa HelloWorldApp
{
public static void Main ()
{
MessageBox . Show ( „Hello World” );
}
}
Definiția clasei
Următorul exemplu definește o clasă numită Persoană care expune o proprietate Name a cărei valoare este stocată în variabila mName :
utilizarea sistemului ;
Program de spațiu de nume
{
clasă Persoană
{
șir privat mName ; // dacă nu specific „privat” nu există diferențe, deoarece se înțelege.
șir public Nume
{
get { return mName ; }
set { mName = valoare ; }
}
}
}
Același exemplu poate fi scris într-o formă echivalentă, utilizând sintaxa Automatic Properties introdusă cu versiunea 3.0:
utilizarea sistemului ;
clasă Persoană
{
șir public Name { get ; set ; }
}
Trebuie remarcat faptul că limbajul C # este un instrument sintactic pentru utilizarea bibliotecilor prezente în spațiile de nume Microsoft .NET Framework. În afară de structurile interne ale limbajului, programatorul C # trebuie să se refere la biblioteci, de asemenea, pentru gestionarea I / O, ca într-adevăr în C și C ++. De fapt, în primul exemplu prezentat este folosit spațiul de nume Sistem , din care metoda WriteLine a clasei Console va fi apoi utilizată pentru a scrie „Hello World” pe ecran.
Calculator
Acest exemplu arată un calculator simplu.
utilizarea sistemului ;
Calculator spațiu de nume
{
Programul clasei
{
static void Main ( string [] args )
{
int Numărul1 = 0 , Numărul2 = 0 ; // Declarați două numere și inițializați-le la 0.
int Rezultat ; // Variabilă utilizată pentru rezultatul celor două numere.
char Choice ; // Alegerea utilizatorului se referă la opțiunile din meniu.
do
{
Consolă . Clear (); // Ștergeți toate scrierile prezente în consolă.
/ * Meniul * /
Consolă . WriteLine ( „Bun venit la calculator.” ); // Scrie „Bun venit la calculator.” În consolă.
Consolă . WriteLine ( "1. Adăugare" ); // Scrieți „1. Adăugare” în consolă.
Consolă . WriteLine ( "2. Subtraction" ); // Scrieți „2. Subtraction” în consolă.
Consolă . WriteLine ( "3. Înmulțirea" ); // Scrieți „3. Înmulțirea” pe consolă.
Consolă . WriteLine ( „Divizia a 4-a” ); // Scrieți în consola „4. Diviziune”.
Consolă . WriteLine ( "5. Exit" ); // Scrieți în consolă „5. Ieșiți”.
Alegere = Consolă . ReadKey (). KeyChar ; // Opțiunea utilizatorului este stocată în variabila „Choice”
Consolă . Clear (); // Ștergeți toate scrierile prezente în consolă.
if ( Alegere ! = '5' )
{
Consolă . Scrieți ( „Introduceți primul număr:” ); // Solicită utilizatorului să introducă primul număr.
Numărul 1 = Conversie . ToInt32 ( Console . ReadLine ()); // Atribuie primul număr introdus de utilizator variabilei „Număr1”.
Consolă . Scrieți ( „Introduceți al doilea număr:” ); // Solicită utilizatorului să introducă al doilea număr.
Număr2 = Conversie . ToInt32 ( Console . ReadLine ()); // Atribuie primul număr introdus de utilizator variabilei „Număr2”.
}
switch ( Choice ) // Cu switchul analizăm diferitele cazuri ale valorii variabilei.
{
cazul '1' :
{
Rezultat = Număr1 + Număr2 ; // Rezultatul adăugării se termină în variabila „Rezultat”.
Consolă . WriteLine ( Number1 + "+" + Number2 + "=" + Result ); // Spuneți utilizatorului rezultatul.
pauză ; // Terminați comutatorul imediat pentru a nu face și celelalte cazuri
}
cazul „2” :
{
Rezultat = Număr1 - Număr2 ; // Rezultatul scăderii ajunge în interiorul variabilei „Rezultat”.
Consolă . WriteLine ( Number1 + "-" + Number2 + "=" + Result ); // Spuneți utilizatorului rezultatul.
pauză ; // Terminați comutatorul imediat pentru a nu face și celelalte cazuri
}
cazul '3' :
{
Rezultat = Număr1 * Număr2 ; // Rezultatul înmulțirii ajunge în interiorul variabilei „Rezultat”.
Consolă . WriteLine ( Number1 + "*" + Number2 + "=" + Result ); // Spuneți utilizatorului rezultatul.
pauză ; // Terminați comutatorul imediat pentru a nu face și celelalte cazuri
}
cazul „4” :
{
if ( Number2 ! = 0 ) // Împărțirea la zero este imposibilă, așa că adăugați un if
{
Rezultat = Număr1 / Număr2 ; // Rezultatul împărțirii ajunge în interiorul variabilei „Rezultat”.
Consolă . WriteLine ( Number1 + "/" + Number2 + "=" + Result ); // Spuneți utilizatorului rezultatul.
}
altceva
{
Consolă . WriteLine ( Number1 + "/" + Number2 + "= Impossible!" ); // Rezultat imposibil
}
pauză ; // Terminați comutatorul imediat pentru a nu face și celelalte cazuri
}
cazul „5” :
{
pauză ; // Terminați comutatorul imediat pentru a nu face și celelalte cazuri
}
implicit :
{
Consolă . WriteLine ( „Opțiune greșită” );
pauză ;
}
}
Consolă . WriteLine ( „Apăsați Enter pentru a merge mai departe” );
Consolă . ReadKey ();
}
while ( Alegere ! = '5' ); // Dacă condiția este adevărată, codul din interior este reexecutat!
}
}
}
Implementări
Compilatorul de referință este Microsoft Visual C # , parte a pachetului Microsoft Visual Studio și în prezent open source [13] .
Există alte implementări pe piață și în circuitele open source .
Mono
Proiectul Mono implementează un compilator C # licențiat open source , o implementare open source completă a CLI sau Common Language Infrastructure , incluzând bibliotecile cadru cerute de specificațiile ECMA , precum și o implementare aproape completă a bibliotecilor de clasă proprietare .NET . actualizat în prezent la versiunea 3.5. Până la versiunea 2.6 a Mono nu există nicio implementare a Windows Presentation Foundation ( WPF ), deși este planificată pentru evoluțiile ulterioare ale platformei Mono. În plus, în prezent sunt planificate doar implementări parțiale ale LINQ către SQL și WCF .
DotGNU
Proiectul DotGNU , în prezent nu mai este acceptat [14] , include un compilator C #, o implementare parțială a CLI , incluzând bibliotecile necesare conform specificației ECMA , precum și un subset al unor biblioteci de clase Microsoft .NET proprietare Microsoft, actualizate la versiunea .NET 2.0.
Rotor
Proiectul Microsoft Rotor, distribuit gratuit doar în scopuri educaționale și de cercetare, oferă o implementare a timpului de execuție CLR și un compilator C #, cu un subset al infrastructurii CLI conforme cu specificația ECMA [15] .
Standardizare
În decembrie 2001, ECMA a publicat „ECMA-334 C # Language Specification” [16] .
C # a devenit un standard ISO în 2003 ( ISO / IEC 23270 ) [17] .
Notă
- ^ Numele joacă pe faptul că C♯, în engleză și alte limbi, denotă nota muzicală C ascuțită, cu un semiton deasupra „C”, sau C (sursă: James Kovacs, C # /. NET History Lesson , pe jameskovacs .com , 7 septembrie 2007. Adus pe 7 iunie 2012 (arhivat din original la 21 august 2011) . ). De fapt, numele limbii ar trebui să fie scris cu simbolul ascuțit , dar semnul hash este folosit în loc pentru comoditatea scrierii (sursă: MSDN , Visual C # FAQ ). În italiană, jocul de cuvinte este pierdut.
- ^ (RO) De ce Microsoft C # nu este pe cnet.com.
- ^ (EN) C # și Java: Compararea limbajelor de programare , pe msdn.microsoft.com.
- ^ (EN) Naomi Hamilton, The AZ of Programming Languages: C # , în Computerworld , 1 octombrie 2008. Adus la 4 februarie 2017.
- ^ (EN) Klaus Kreft și Angelika Langer, După Java și C # - ce urmează? , pe www.artima.com . Accesat la 4 februarie 2017 .
- ^ Istoria C # , la docs.microsoft.com .
- ^ (EN) Covarianță și contravarianță (C #) , pe MSDN.
- ^ (RO) Introducere în noile funcții în C # 5.0 , în Blogul Programului Microsoft MVP Award. Accesat la 4 februarie 2017 .
- ^ Mark Michaelis, New and Improved C # 6.0 , la msdn.microsoft.com . Adus în octombrie 2014 .
- ^ (RO) Stare caracteristici lingvistice , pe github.com.
- ^ C # 8 Știri , la docs.microsoft.com .
- ^ C # 9 Știri , la docs.microsoft.com .
- ^ (EN) Proiect DonTen Roslyn pe GutHub , pe github.com.
- ^ (EN) DotGNU Project , pe gnu.org.
- ^ (EN) Project Rotor în MSDN , pe msdn.microsoft.com.
- ^ Standardul ECMA-334 , la ecma-international.org .
- ^ http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=36768 Arhivat 8 mai 2012 la Internet Archive . - Standardizarea ISO
Bibliografie
- John Sharp, Microsoft Visual C # 2012 , Mondadori Informatica, 2014, p. 251, ISBN 978-88-6114-404-0 .
- ( RO ) A. Boehm, J. Murach, Murach's C # 2015 , Mike Murach & Associates, 2016, p. 908, ISBN 978-1-890774-94-3 .
- D. Bochicchio, C. Civera, M. De Sanctis, A. Leoncini, M. Leoncini, S. Mostarda, C # 6 și Visual studio 2015. Ghid complet pentru dezvoltator , Hoepli Informatica, 2016, p. 456, ISBN 978-88-203-7099-2 .
- Antonio Pelleriti, Programare cu C # 8. Ghid complet , Ediții LSWR, 2019, p. 928, ISBN 978-88-68957698 .
- ( EN ) A. Troelsen, P. Japikse, C # 6.0 și .NET 4.6 Framework , Apress, 2016, p. 1625, ISBN 978-1-4842-1333-9 .
- ( EN ) J. Albahari, B. Albahari, C # 6.0 in a Nutshell: The Definitive Reference , O'Reilly Media, 2016, p. 1136, ISBN 978-1-4919-2706-9 .
- (IT) A. Pelleriti Programare cu C # 8, Digital Life Style, p. 243, ISBN 978-88-6895-769-8
Alte proiecte
- Wikibooks conține texte sau manuale pe C #
- Wikiversitatea conține resurse pe C #
- Wikimedia Commons conține imagini sau alte fișiere pe C #
linkuri externe
- Noțiuni introductive despre C # , la msdn.microsoft.com .
- Specificația limbii C # (MSDN) , la msdn.microsoft.com .
- Mono: platformă de dezvoltare Opensource , pe mono-project.com .
- Grupul de utilizatori italieni Dot NET , pe ugidotnet.org .
- DotGNU Project - o platformă compatibilă cu software gratuit .NET , la dotgnu.org .
Controllo di autorità | LCCN ( EN ) sh2001001705 · GND ( DE ) 4616843-6 · BNF ( FR ) cb13614817q (data) |
---|