C ascuțit

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Notă despre dezambiguizare.svg
Titlul acestei pagini este incorect datorită caracteristicilor software-ului MediaWiki . Titlul corect este C # .
Notă despre dezambiguizare.svg Dezambiguizare - Dacă căutați nota C ascuțită, consultați C (notă) .
C #
limbaj de programare
C Sharp wordmark.svg
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

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ă

  1. ^ 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.
  2. ^ (RO) De ce Microsoft C # nu este pe cnet.com.
  3. ^ (EN) C # și Java: Compararea limbajelor de programare , pe msdn.microsoft.com.
  4. ^ (EN) Naomi Hamilton, The AZ of Programming Languages: C # , în Computerworld , 1 octombrie 2008. Adus la 4 februarie 2017.
  5. ^ (EN) Klaus Kreft și Angelika Langer, După Java și C # - ce urmează? , pe www.artima.com . Accesat la 4 februarie 2017 .
  6. ^ Istoria C # , la docs.microsoft.com .
  7. ^ (EN) Covarianță și contravarianță (C #) , pe MSDN.
  8. ^ (RO) Introducere în noile funcții în C # 5.0 , în Blogul Programului Microsoft MVP Award. Accesat la 4 februarie 2017 .
  9. ^ Mark Michaelis, New and Improved C # 6.0 , la msdn.microsoft.com . Adus în octombrie 2014 .
  10. ^ (RO) Stare caracteristici lingvistice , pe github.com.
  11. ^ C # 8 Știri , la docs.microsoft.com .
  12. ^ C # 9 Știri , la docs.microsoft.com .
  13. ^ (EN) Proiect DonTen Roslyn pe GutHub , pe github.com.
  14. ^ (EN) DotGNU Project , pe gnu.org.
  15. ^ (EN) Project Rotor în MSDN , pe msdn.microsoft.com.
  16. ^ Standardul ECMA-334 , la ecma-international.org .
  17. ^ 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

linkuri externe

Controllo di autorità LCCN ( EN ) sh2001001705 · GND ( DE ) 4616843-6 · BNF ( FR ) cb13614817q (data)