De geschiedenis van C#

Dit artikel bevat een geschiedenis van elke belangrijke versie van de C#-taal. Het C#-team blijft innoveren en nieuwe functies toevoegen. Gedetailleerde status van taalfuncties, inclusief functies die in aanmerking komen voor toekomstige releases, vindt u in de dotnet-/roslyn-opslagplaats op GitHub.

Belangrijk

De C#-taal is afhankelijk van typen en methoden in wat de C#-specificatie definieert als een standaardbibliotheek voor sommige functies. Het .NET-platform levert deze typen en methoden in een aantal pakketten. Een voorbeeld hiervan is het verwerken van uitzonderingen. Elke throw instructie of expressie wordt gecontroleerd om ervoor te zorgen dat het object dat wordt gegenereerd, wordt afgeleid van Exception. Op dezelfde manier wordt elk catch gecontroleerd om ervoor te zorgen dat het type dat wordt gevangen, wordt afgeleid van Exception. Elke versie kan nieuwe vereisten toevoegen. Als u de nieuwste taalfuncties in oudere omgevingen wilt gebruiken, moet u mogelijk specifieke bibliotheken installeren. Deze afhankelijkheden worden beschreven op de pagina voor elke specifieke versie. Meer informatie over de relaties tussen taal en bibliotheek voor achtergrondinformatie over deze afhankelijkheid.

C#-versie 12

Uitgebracht in november 2023

De volgende functies zijn toegevoegd in C# 12:

En Interceptors- is uitgebracht als preview-functie.

Over het algemeen biedt C# 12 nieuwe functies waarmee u productiever C#-code kunt schrijven. De syntaxis die u al wist, is op meer plaatsen beschikbaar. Andere syntaxis maakt consistentie mogelijk voor gerelateerde concepten.

C#-versie 11

Uitgebracht in november 2022

De volgende functies zijn toegevoegd in C# 11:

C# 11 introduceert algemene wiskundige en verschillende functies die dit doel ondersteunen. U kunt eenmaal numerieke algoritmen schrijven voor alle getaltypen. Er zijn meer functies om het werken met struct typen eenvoudiger te maken, zoals vereiste leden en automatisch standaard structs. Werken met tekenreeksen wordt eenvoudiger met letterlijke letterlijke onbewerkte tekenreeksen, newline in tekenreeksinterpolaties en letterlijke UTF-8-tekenreeksen. Met functies zoals lokale bestandstypen kunnen brongeneratoren eenvoudiger worden. Ten slotte voegen lijstpatronen meer ondersteuning toe voor patroonkoppeling.

C#-versie 10

Uitgebracht in november 2021

C# 10 voegt de volgende functies en verbeteringen toe aan de C#-taal:

Er zijn meer functies beschikbaar in de preview-modus . Als u deze functies wilt gebruiken, moet u dit instellen Preview<LangVersion> in uw project:

C# 10 blijft werken aan thema's voor het verwijderen van ceremonies, het scheiden van gegevens uit algoritmen en verbeterde prestaties voor de .NET Runtime.

Veel van de functies betekenen dat u minder code typt om dezelfde concepten uit te drukken. Record-structs synthetiseren veel van dezelfde methoden die recordklassen doen. Structs en anonieme typen ondersteunen met expressies. Globaal gebruik van instructies en declaraties van bestandsbereiken betekent dat u afhankelijkheden en naamruimteorganisatie duidelijker uitdrukt. Lambda-verbeteringen maken het gemakkelijker om lambda-expressies te declareren waar ze worden gebruikt. Nieuwe eigenschapspatronen en verbeteringen voor deconstructie maken beknoptere code.

De nieuwe geïnterpoleerde tekenreekshandlers en AsyncMethodBuilder het gedrag kunnen de prestaties verbeteren. Deze taalfuncties zijn toegepast in .NET Runtime om prestatieverbeteringen in .NET 6 te bereiken.

C# 10 markeert ook meer van een verschuiving naar het jaarlijkse ritme voor .NET-releases. Omdat niet elke functie in een jaarlijks tijdsbestek kan worden voltooid, kunt u een aantal preview-functies in C# 10 proberen. Zowel algemene kenmerken als statische abstracte leden in interfaces kunnen worden gebruikt, maar deze preview-functies kunnen veranderen vóór de definitieve release.

C#-versie 9

Uitgebracht in november 2020

C# 9 is uitgebracht met .NET 5. Dit is de standaardtaalversie voor elke assembly die is gericht op de .NET 5-release. Het bevat de volgende nieuwe en verbeterde functies:

C# 9 vervolgt drie van de thema's uit eerdere releases: ceremonie verwijderen, gegevens scheiden van algoritmen en meer patronen op meer plaatsen bieden.

Instructies op het hoogste niveau betekent dat uw hoofdprogramma eenvoudiger te lezen is. Er is minder behoefte aan ceremonie: een naamruimte, een Program klas en static void Main() zijn allemaal overbodig.

De introductie van records biedt een beknopte syntaxis voor referentietypen die waardenemantiek volgen voor gelijkheid. U gebruikt deze typen om gegevenscontainers te definiëren die doorgaans minimaal gedrag definiëren. Init-only setters bieden de mogelijkheid voor niet-destructieve mutatie (with expressies) in records. C# 9 voegt ook covariant-retourtypen toe, zodat afgeleide records virtuele methoden kunnen overschrijven en een type kunnen retourneren dat is afgeleid van het retourtype van de basismethode.

De patroonkoppelingsmogelijkheden zijn op verschillende manieren uitgebreid. Numerieke typen ondersteunen nu bereikpatronen. Patronen kunnen worden gecombineerd met behulp van and, oren not patronen. Haakjes kunnen worden toegevoegd om complexere patronen te verduidelijken:

C# 9 bevat nieuwe verbeteringen voor patroonkoppeling:

  • Typepatronen komen overeen met een object dat overeenkomt met een bepaald type
  • Haakjes patronen afdwingen of benadrukken de prioriteit van patrooncombinaties
  • and Voor beide patronen moeten beide patronen overeenkomen
  • Voor disjunctive or patronen is een van beide patronen vereist die overeenkomen met
  • Voor ontkende not patronen is vereist dat een patroon niet overeenkomt
  • Voor relationele patronen moet de invoer kleiner zijn dan, groter dan, kleiner dan of gelijk aan of gelijk aan een bepaalde constante

Deze patronen verrijken de syntaxis voor patronen. Bekijk deze voorbeelden:

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

Met optionele haakjes om duidelijk te maken dat de and prioriteit hoger is dan or:

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

Een van de meest voorkomende toepassingen is een nieuwe syntaxis voor een null-controle:

if (e is not null)
{
    // ...
}

Elk van deze patronen kan worden gebruikt in elke context waarin patronen zijn toegestaan: is patroonexpressies, switch expressies, geneste patronen en het patroon van het label van een switch instructie case .

Een andere set functies biedt ondersteuning voor high-performance computing in C#:

  • De nint en nuint typen modelleren de typen gehele getallen van systeemeigen grootte op de doel-CPU.
  • Functiepointers bieden gedelegeerde-achtige functionaliteit terwijl de toewijzingen worden voorkomen die nodig zijn om een gedelegeerde-object te maken.
  • De localsinit instructie kan worden weggelaten om instructies op te slaan.

Prestaties en interoperabiliteit

Een andere set verbeteringen ondersteunt scenario's waarbij codegeneratoren functionaliteit toevoegen:

Functies aanpassen en voltooien

C# 9 voegt veel andere kleine functies toe die de productiviteit van ontwikkelaars verbeteren, zowel het schrijven als lezen van code:

  • Expressies van het doeltype new
  • static anonieme functies
  • Voorwaardelijke expressies van het doeltype
  • Extensieondersteuning GetEnumerator() voor foreach lussen
  • Lambda-expressies kunnen verwijderingsparameters declareren
  • Kenmerken kunnen worden toegepast op lokale functies

De C# 9-release blijft het werk uitvoeren om C# een moderne programmeertaal voor algemeen gebruik te behouden. Functies blijven moderne workloads en toepassingstypen ondersteunen.

C#-versie 8.0

Uitgebracht in september 2019

C# 8.0 is de eerste primaire C#-release die specifiek gericht is op .NET Core. Sommige functies zijn afhankelijk van nieuwe CLR-mogelijkheden (Common Language Runtime), andere functies op bibliotheektypen die alleen zijn toegevoegd in .NET Core. C# 8.0 voegt de volgende functies en verbeteringen toe aan de C#-taal:

Standaardinterfaceleden vereisen verbeteringen in de CLR. Deze functies zijn toegevoegd in de CLR voor .NET Core 3.0. Bereiken en indexen en asynchrone streams vereisen nieuwe typen in de .NET Core 3.0-bibliotheken. Nullable reference types, terwijl geïmplementeerd in de compiler, is veel nuttiger wanneer bibliotheken worden geannoteerd om semantische informatie te geven met betrekking tot de null-status van argumenten en retourwaarden. Deze aantekeningen worden toegevoegd in de .NET Core-bibliotheken.

C# versie 7.3

Uitgebracht in mei 2018

Er zijn twee hoofdthema's voor de C# 7.3-release. Eén thema biedt functies waarmee veilige code net zo goed presteert als onveilige code. Het tweede thema biedt incrementele verbeteringen aan bestaande functies. Er zijn ook nieuwe compileropties toegevoegd in deze release.

De volgende nieuwe functies ondersteunen het thema van betere prestaties voor veilige code:

  • U hebt toegang tot vaste velden zonder vast te maken.
  • U kunt lokale variabelen opnieuw toewijzen ref .
  • U kunt initialisaties gebruiken voor stackalloc matrices.
  • U kunt instructies gebruiken fixed met elk type dat ondersteuning biedt voor een patroon.
  • U kunt algemenere beperkingen gebruiken.

De volgende verbeteringen zijn aangebracht in bestaande functies:

  • U kunt tuple-typen testen == en != gebruiken.
  • U kunt expressievariabelen op meer locaties gebruiken.
  • U kunt kenmerken koppelen aan het backingveld van automatisch geïmplementeerde eigenschappen.
  • Methodeomzetting wanneer argumenten verschillen in met is verbeterd.
  • Overbelastingsresolutie heeft nu minder dubbelzinnige gevallen.

De nieuwe compileropties zijn:

  • -publicsign om OSS-ondertekening (Open Source Software) van assembly's in te schakelen.
  • -pathmap om een toewijzing voor bronmappen op te geven.

C# versie 7.2

Uitgebracht in november 2017

C# 7.2 heeft verschillende functies voor kleine talen toegevoegd:

  • Initialisatiefunctie voor stackalloc matrices.
  • Gebruik fixed instructies met elk type dat ondersteuning biedt voor een patroon.
  • Vaste velden openen zonder vast te maken.
  • Lokale variabelen opnieuw toewijzen ref .
  • Declareer readonly struct typen om aan te geven dat een struct onveranderbaar is en als parameter in moet worden doorgegeven aan de lidmethoden.
  • Voeg de in wijzigingsfunctie toe aan parameters om op te geven dat een argument wordt doorgegeven door verwijzing, maar niet wordt gewijzigd door de aangeroepen methode.
  • Gebruik de ref readonly wijzigingsfunctie voor methode retourneert om aan te geven dat een methode de waarde retourneert op basis van verwijzing, maar schrijfbewerkingen naar dat object niet toestaat.
  • Declareer ref struct typen om aan te geven dat een struct-type rechtstreeks toegang heeft tot beheerd geheugen en altijd moet worden gestapeld.
  • Gebruik aanvullende algemene beperkingen.
  • Niet-gevolgde benoemde argumenten:
    • Positionele argumenten kunnen benoemde argumenten volgen.
  • Voorlooponderstrepingstekens in numerieke letterlijke waarden:
    • Numerieke letterlijke waarden kunnen nu voorloopstrepingstekens hebben voordat eventuele afgedrukte cijfers worden afgedrukt.
  • private protected wijzigingsfunctie voor toegang:
    • De private protected toegangsaanpassing maakt toegang mogelijk voor afgeleide klassen in dezelfde assembly.
  • Voorwaardelijke ref expressies:
    • Het resultaat van een voorwaardelijke expressie (?:) kan nu een verwijzing zijn.

C# versie 7.1

Uitgebracht in augustus 2017

C# is begonnen met het vrijgeven van puntreleases met C# 7.1. Deze versie heeft het configuratie-element voor taalversieselectie , drie nieuwe taalfuncties en nieuw compilergedrag toegevoegd.

De nieuwe taalfuncties in deze release zijn:

  • asyncMain Methode
    • Het toegangspunt voor een toepassing kan de async wijzigingsfunctie hebben.
  • default letterlijke expressies
    • U kunt standaard letterlijke expressies gebruiken in standaardwaarde-expressies wanneer het doeltype kan worden afgeleid.
  • Namen van uitgestelde tuple-elementen
    • De namen van tuple-elementen kunnen in veel gevallen worden afgeleid van tuple-initialisatie.
  • Patroonkoppeling voor algemene typeparameters
    • U kunt patroonovereenkomstexpressies gebruiken voor variabelen waarvan het type een algemene typeparameter is.

Ten slotte heeft de compiler twee opties -refout en -refonly die het genereren van referentieassembly's beheren.

C#-versie 7.0

Uitgebracht in maart 2017

C#-versie 7.0 is uitgebracht met Visual Studio 2017. Deze versie heeft enkele evolutionaire en coole dingen in de ader van C# 6.0. Hier volgen enkele van de nieuwe functies:

Andere functies zijn inbegrepen:

Al deze functies bieden nieuwe mogelijkheden voor ontwikkelaars en de mogelijkheid om schonere code te schrijven dan ooit. Een markering is het verkorten van de declaratie van variabelen die moeten worden gebruikt met het out trefwoord en door meerdere retourwaarden via tuple toe te staan. .NET Core is nu gericht op elk besturingssysteem en heeft zijn ogen stevig op de cloud en op draagbaarheid. Deze nieuwe mogelijkheden bezetten zeker de gedachten en tijd van taalontwerpers, naast het bedenken van nieuwe functies.

C# versie 6.0

Uitgebracht in juli 2015

Versie 6.0, uitgebracht met Visual Studio 2015, heeft veel kleinere functies uitgebracht die C#-programmering productiever maakten. Hier volgen een paar van deze manieren:

Andere nieuwe functies zijn:

  • Initialisatiefuncties voor indexen
  • Wachten op catch/finally blocks
  • Standaardwaarden voor alleen-ophalen-eigenschappen

Als u deze functies samen bekijkt, ziet u een interessant patroon. In deze versie is C# begonnen met het elimineren van de standaardtaal om code beter leesbaar en leesbaarder te maken. Dus voor fans van schone, eenvoudige code was deze taalversie een enorme winst.

Ze deden één ander ding samen met deze versie, maar het is geen traditionele taalfunctie op zichzelf. Ze hebben Roslyn de compiler uitgebracht als een service. De C#-compiler is nu geschreven in C#en u kunt de compiler gebruiken als onderdeel van uw programmeringsinspanningen.

C#-versie 5.0

Uitgebracht in augustus 2012

C#-versie 5.0, uitgebracht met Visual Studio 2012, was een gerichte versie van de taal. Bijna alle inspanningen voor die versie gingen naar een ander concept van baanbrekende taal: het async en await model voor asynchrone programmering. Dit is de belangrijkste lijst met functies:

Met het kenmerk info van de aanroeper kunt u eenvoudig informatie ophalen over de context waarin u wordt uitgevoerd zonder gebruik te maken van een ton met standaardspiegelingscode. Het heeft veel toepassingen in diagnostische gegevens en logboekregistratietaken.

Maar async en await zijn de echte sterren van deze release. Toen deze functies in 2012 uitkwamen, veranderde C# het spel opnieuw door asynchroon in de taal te bakken als eersteklas deelnemer.

C#-versie 4.0

Uitgebracht in april 2010

C#-versie 4.0, uitgebracht met Visual Studio 2010, heeft enkele interessante nieuwe functies geïntroduceerd:

Ingesloten interoperabiliteitstypen hebben de implementatiepijn van het maken van COM-interoperabiliteitsassembly's voor uw toepassing versoepeld. Algemene covariantie en contravariantie geven u meer kracht om generieken te gebruiken, maar ze zijn een beetje academisch en waarschijnlijk het meest gewaardeerd door framework- en bibliotheekauteurs. Met benoemde en optionele parameters kunt u veel overbelastingen van methoden elimineren en gemak bieden. Maar geen van deze functies zijn precies paradigma's die veranderen.

De belangrijkste functie was de introductie van het dynamic trefwoord. Het dynamic trefwoord dat is geïntroduceerd in C#-versie 4.0, is de mogelijkheid om de compiler te overschrijven bij het typen van compilatietijd. Met behulp van het dynamische trefwoord kunt u constructies maken die vergelijkbaar zijn met dynamisch getypte talen zoals JavaScript. U kunt er een dynamic x = "a string" maken en er vervolgens zes aan toevoegen, zodat u de runtime kunt laten bepalen wat er moet gebeuren.

Dynamische binding biedt u het potentieel voor fouten, maar ook grote kracht in de taal.

C#-versie 3.0

Uitgebracht in november 2007

C#-versie 3.0 kwam eind 2007, samen met Visual Studio 2008, hoewel de volledige boot met taalfuncties daadwerkelijk zou worden geleverd met .NET Framework versie 3.5. Deze versie heeft een belangrijke wijziging in de groei van C# gemarkeerd. C# werd opgericht als een echt enorme programmeertaal. Laten we eens kijken naar enkele belangrijke functies in deze versie:

Met terugwerkende kracht lijken veel van deze functies zowel onvermijdelijk als onafscheidelijk. Ze passen allemaal strategisch bij elkaar. De moordenaarfunctie van deze C#-versie was de query-expressie, ook wel bekend als Language-Integrated Query (LINQ).

Een meer genuanceerde weergave onderzoekt expressiestructuren, lambda-expressies en anonieme typen als de basis waarop LINQ is opgebouwd. Maar in beide gevallen heeft C# 3.0 een revolutionaire concept gepresenteerd. C# 3.0 begon de basis te leggen voor het omzetten van C# in een hybride objectgeoriënteerde / functionele taal.

U kunt nu met name SQL-stijl, declaratieve query's schrijven om onder andere bewerkingen uit te voeren op verzamelingen. In plaats van een for lus te schrijven om het gemiddelde van een lijst met gehele getallen te berekenen, kunt u dat nu gewoon doen als list.Average(). De combinatie van query-expressies en extensiemethoden maakte een lijst met gehele getallen veel slimmer.

C#-versie 2.0

Uitgebracht in november 2005

Laten we eens kijken naar enkele belangrijke functies van C# 2.0, uitgebracht in 2005, samen met Visual Studio 2005:

Andere C# 2.0-functies hebben mogelijkheden toegevoegd aan bestaande functies:

  • Afzonderlijke toegankelijkheid van getter/setter
  • Methodegroepconversies (gemachtigden)
  • Statische klassen
  • Deductie delegeren

Terwijl C# begon als een algemene objectgeoriënteerde taal (OO), veranderde C# versie 2.0 dat in een haast. Met generics kunnen typen en methoden op een willekeurig type werken terwijl de veiligheid van het type behouden blijft. U kunt bijvoorbeeld typen List<T> veilige bewerkingen uitvoeren List<string> op List<int> deze tekenreeksen of gehele getallen terwijl u ze doorloopt. Het gebruik van generics is beter dan het maken van een ListInt type dat is afgeleid van ArrayList of gieten van Object voor elke bewerking.

C#-versie 2.0 heeft iterators meegenomen. Om het beknopt te maken, kunt u met iterators alle items in een List (of andere enumerable typen) met een foreach lus onderzoeken. Iterators hebben als eersteklas onderdeel van de taal aanzienlijk verbeterde leesbaarheid van de taal en de mogelijkheid van personen om te redeneren over de code.

C#-versie 1.2

Uitgebracht in april 2003

C#-versie 1.2 geleverd met Visual Studio .NET 2003. Het bevatte enkele kleine verbeteringen in de taal. Het meest opmerkelijk is dat vanaf deze versie de code die wordt gegenereerd in een foreach lus die wordt aangeroepen Dispose op een IEnumerator wanneer die IEnumerator is geïmplementeerd IDisposable.

C#-versie 1.0

Uitgebracht in januari 2002

Wanneer u teruggaat en kijkt, ziet C#-versie 1.0, uitgebracht met Visual Studio .NET 2002, er veel uit als Java. Als onderdeel van de gestelde ontwerpdoelstellingen voor ECMA, wilde het een "eenvoudige, moderne, objectgeoriënteerde taal voor algemeen gebruik" zijn. Op dat moment, zoals Java, betekende het dat het die vroege ontwerpdoelen bereikte.

Maar als je nu terugkijkt op C# 1.0, zou je jezelf een beetje duizelig vinden. Het miste de ingebouwde asynchrone mogelijkheden en een aantal van de gelikte functionaliteiten rond generics die u voor het eerst aanneemt. Eigenlijk miste het generieken helemaal. En LINQ? Nog niet beschikbaar. Die toevoegingen zouden enkele jaren duren.

C#-versie 1.0 zag er gestript uit van functies, vergeleken met vandaag. U zou merken dat u uitgebreide code schrijft. Maar toch moet je ergens beginnen. C#-versie 1.0 was een levensvatbaar alternatief voor Java op het Windows-platform.

De belangrijkste functies van C# 1.0 zijn inbegrepen:

Artikeloorspronkelijk gepubliceerd op de NDepend blog, met dank aan Erik Dietrich en Patrick Smacchia.