Historiken för C#
Den här artikeln innehåller en historik över varje större version av C#-språket. C#-teamet fortsätter att förnya och lägga till nya funktioner. Detaljerad språkfunktionsstatus, inklusive funktioner som beaktas för kommande versioner, finns på dotnet/roslyn-lagringsplatsen på GitHub.
Viktigt!
C#-språket förlitar sig på typer och metoder i vad C#-specifikationen definierar som ett standardbibliotek för vissa av funktionerna. .NET-plattformen levererar dessa typer och metoder i ett antal paket. Ett exempel är undantagsbearbetning. Varje throw
instruktion eller uttryck kontrolleras för att säkerställa att objektet som genereras härleds från Exception. På samma sätt kontrolleras varje catch
för att säkerställa att den typ som fångas härleds från Exception. Varje version kan lägga till nya krav. Om du vill använda de senaste språkfunktionerna i äldre miljöer kan du behöva installera specifika bibliotek. Dessa beroenden dokumenteras på sidan för varje specifik version. Du kan lära dig mer om relationerna mellan språk och bibliotek för bakgrund av det här beroendet.
C# version 12
Släpptes november 2023
Följande funktioner har lagts till i C# 12:
- Primära konstruktorer – Du kan skapa primära konstruktorer i valfri
class
typ.struct
- Samlingsuttryck – En ny syntax för att ange samlingsuttryck, inklusive spridningselementet (
..e
), för att expandera alla samlingar. - Infogade matriser – Med infogade matriser kan du skapa en matris med fast storlek i en
struct
typ. - Valfria parametrar i lambda-uttryck – Du kan definiera standardvärden för parametrar för lambda-uttryck.
ref readonly
parameterparametrar -ref readonly
ger mer klarhet för API:er som kan användaref
parametrar ellerin
parametrar.- Alias alla typer – Du kan använda
using
aliasdirektivet för att alias alla typer, inte bara namngivna typer. - Experimentellt attribut – Ange en experimentell funktion.
Och Interceptors - släpptes som en förhandsversionsfunktion.
Totalt sett innehåller C# 12 nya funktioner som gör dig mer produktiv när du skriver C#-kod. Syntax som du redan visste är tillgänglig på fler platser. Annan syntax möjliggör konsekvens för relaterade begrepp.
C# version 11
Publicerad november 2022
Följande funktioner har lagts till i C# 11:
- Råa strängliteraler
- Allmänt matematiskt stöd
- Allmänna attribut
- UTF-8 strängliteraler
- Newlines i stränginterpolationsuttryck
- Listmönster
- Fillokala typer
- Obligatoriska medlemmar
- Automatisk standard-structs
- Mönstermatchning
Span<char>
på en konstantstring
- Utökat
nameof
omfång - Numerisk intPtr
ref
fält ochscoped ref
- Förbättrad metodgruppkonvertering till ombud
- Varningsvåg 7
C# 11 introducerar allmän matematik och flera funktioner som stöder det målet. Du kan skriva numeriska algoritmer en gång för alla nummertyper. Det finns fler funktioner som gör det enklare att arbeta med struct
typer, till exempel obligatoriska medlemmar och automatiska standardstrukturer. Det blir enklare att arbeta med strängar med råa strängliteraler, ny rad i stränginterpolationer och UTF-8-strängliteraler. Funktioner som lokala filtyper gör att källgeneratorer blir enklare. Slutligen lägger listmönster till mer stöd för mönstermatchning.
C# version 10
Publicerad november 2021
C# 10 lägger till följande funktioner och förbättringar i C#-språket:
- Post structs
- Förbättringar av strukturtyper
- Interpolerade stränghanterare
global using
Direktiv- Namnområdesdeklaration med filomfattning
- Utökade egenskapsmönster
- Förbättringar av lambda-uttryck
- Tillåt
const
interpolerade strängar - Posttyper kan förseglas
ToString()
- Förbättrad bestämd tilldelning
- Tillåt både tilldelning och deklaration i samma dekonstruktion
- Tillåt
AsyncMethodBuilder
attribut för metoder - CallerArgumentExpression-attribut
- Förbättrad
#line
pragma
Fler funktioner var tillgängliga i förhandsgranskningsläge . För att kunna använda de här funktionerna måste du ange <LangVersion>
till Preview
i projektet:
- Allmänna attribut senare i den här artikeln.
- statiska abstrakta medlemmar i gränssnitt.
C# 10 fortsätter att arbeta med teman för att ta bort ceremonier, separera data från algoritmer och förbättrade prestanda för .NET Runtime.
Många av funktionerna innebär att du skriver mindre kod för att uttrycka samma begrepp. Poststrukturer syntetiserar många av samma metoder som postklasser gör. Structs och anonyma typer stöder uttryck. Globala användningsdirektiv och filomfattande namnområdesdeklarationer innebär att du uttrycker beroenden och namnområdesorganisation tydligare. Lambda-förbättringar gör det lättare att deklarera lambda-uttryck där de används. Nya egenskapsmönster och dekonstruktionsförbättringar skapar mer koncis kod.
De nya interpolerade stränghanterarna och AsyncMethodBuilder
beteendet kan förbättra prestandan. Dessa språkfunktioner tillämpades i .NET Runtime för att uppnå prestandaförbättringar i .NET 6.
C# 10 markerar också mer av en övergång till den årliga kadensen för .NET-versioner. Eftersom inte alla funktioner kan slutföras inom en årlig tidsram kan du prova ett par "förhandsversionsfunktioner" i C# 10. Både allmänna attribut och statiska abstrakta medlemmar i gränssnitt kan användas, men dessa förhandsversionsfunktioner kan ändras innan de släpps.
C# version 9
Släpptes november 2020
C# 9 släpptes med .NET 5. Det är standardspråkversionen för alla sammansättningar som är inriktade på .NET 5-versionen. Den innehåller följande nya och förbättrade funktioner:
- Poster
- Init-endast setters
- Instruktioner på den översta nivån
- Förbättringar av mönstermatchning: relationsmönster och logiska mönster
- Prestanda och interop
- Anpassa och avsluta funktioner
C# 9 fortsätter tre av temana från tidigare versioner: ta bort ceremonier, separera data från algoritmer och ge fler mönster på fler platser.
Toppnivåinstruktioner innebär att huvudprogrammet är enklare att läsa. Det finns mindre behov av ceremoni: ett namnområde, en Program
klass och static void Main()
är alla onödiga.
Introduktionen av records
ger en koncis syntax för referenstyper som följer värdesemantik för likhet. Du använder dessa typer för att definiera datacontainrar som vanligtvis definierar minimalt beteende. Init-only setters tillhandahåller funktionen för icke-förstörande mutation (with
uttryck) i poster. C# 9 lägger också till covarianta returtyper så att härledda poster kan åsidosätta virtuella metoder och returnera en typ som härleds från basmetodens returtyp.
Funktionerna för mönstermatchning expanderade på flera sätt. Numeriska typer stöder nu intervallmönster. Mönster kan kombineras med hjälp av and
, or
och not
mönster. Parenteser kan läggas till för att förtydliga mer komplexa mönster:
C# 9 innehåller nya förbättringar av mönstermatchning:
- Typmönster matchar ett objekt som matchar en viss typ
- Parenteserade mönster framtvingar eller betonar prioriteten för mönsterkombinationer
- Konjunktiva
and
mönster kräver att båda mönstren matchar - Disjunctive
or
mönster kräver endera mönster för att matcha - Negerade
not
mönster kräver att ett mönster inte matchar - Relationsmönster kräver att indata är mindre än, större än, mindre än eller lika med eller större än eller lika med en viss konstant
Dessa mönster berikar syntaxen för mönster. Tänk på följande exempel:
public static bool IsLetter(this char c) =>
c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';
Med valfria parenteser för att göra det tydligt att and
har högre prioritet än or
:
public static bool IsLetterOrSeparator(this char c) =>
c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';
En av de vanligaste användningsområdena är en ny syntax för en null-kontroll:
if (e is not null)
{
// ...
}
Något av dessa mönster kan användas i alla sammanhang där mönster tillåts: is
mönsteruttryck, switch
uttryck, kapslade mönster och mönstret för en switch
instruktions case
etikett.
En annan uppsättning funktioner stöder högpresterande databehandling i C#:
- Typerna
nint
ochnuint
modellerar heltalstyperna för den interna storleken på målprocessorn. - Funktionspekare ger delegerade funktioner samtidigt som du undviker de allokeringar som krävs för att skapa ett ombudsobjekt.
- Instruktionen
localsinit
kan utelämnas för att spara instruktioner.
Prestanda och interop
En annan uppsättning förbättringar stöder scenarier där kodgeneratorer lägger till funktioner:
- Modulinitierare är metoder som körningen anropar när en sammansättning läses in.
- Partiella metoder stöder nya åtkomstkänsliga modifierare och icke-void-returtyper. I dessa fall måste ett genomförande tillhandahållas.
Anpassa och avsluta funktioner
C# 9 lägger till många andra små funktioner som förbättrar utvecklarproduktiviteten, både när du skriver och läser kod:
- Måltyputtryck
new
static
anonyma funktioner- Villkorsuttryck av måltyp
- Tilläggsstöd
GetEnumerator()
förforeach
loopar - Lambda-uttryck kan deklarera parametrar för ignorerande
- Attribut kan tillämpas på lokala funktioner
C# 9-versionen fortsätter arbetet med att hålla C# ett modernt, allmänt programmeringsspråk. Funktioner fortsätter att stödja moderna arbetsbelastningar och programtyper.
C# version 8.0
Publicerad september 2019
C# 8.0 är den första större C#-versionen som specifikt riktar sig till .NET Core. Vissa funktioner förlitar sig på nya CLR-funktioner (Common Language Runtime), andra på bibliotekstyper som endast läggs till i .NET Core. C# 8.0 lägger till följande funktioner och förbättringar i C#-språket:
- Readonly-medlemmar
- Standardgränssnittsmetoder
- Förbättringar av mönstermatchning:
- Växla uttryck
- Egenskapsmönster
- Tupplar
- Positionsmönster
- Använda deklarationer
- Statiska lokala funktioner
- Disponibla ref structs
- Referenstyper som kan ogiltigförklaras
- Asynkrona strömmar
- Index och intervall
- Null-sammankopplingstilldelning
- Ohanterade konstruktionstyper
- Stackalloc i kapslade uttryck
- Förbättring av interpolerade ordagranna strängar
Standardgränssnittsmedlemmar kräver förbättringar i CLR. Dessa funktioner har lagts till i CLR för .NET Core 3.0. Intervall och index och asynkrona strömmar kräver nya typer i .NET Core 3.0-biblioteken. Nullbara referenstyper, även om de implementeras i kompilatorn, är mycket mer användbara när bibliotek kommenteras för att tillhandahålla semantisk information om null-tillståndet för argument och returvärden. Dessa anteckningar läggs till i .NET Core-biblioteken.
C# version 7.3
Publicerad maj 2018
Det finns två huvudteman i C# 7.3-versionen. Ett tema innehåller funktioner som gör att säker kod kan vara lika högpresterande som osäker kod. Det andra temat ger stegvisa förbättringar av befintliga funktioner. Nya kompilatoralternativ har också lagts till i den här versionen.
Följande nya funktioner stöder temat bättre prestanda för säker kod:
- Du kan komma åt fasta fält utan att fästa.
- Du kan omtilldela
ref
lokala variabler. - Du kan använda initialiserare på
stackalloc
matriser. - Du kan använda
fixed
instruktioner med valfri typ som stöder ett mönster. - Du kan använda mer allmänna begränsningar.
Följande förbättringar har gjorts i befintliga funktioner:
- Du kan testa
==
och!=
med tuppelns typer. - Du kan använda uttrycksvariabler på fler platser.
- Du kan koppla attribut till bakgrundsfältet för automatiskt implementerade egenskaper.
- Metodmatchning när argumenten skiljer sig åt
in
med förbättrades. - Överbelastningsmatchningen har nu färre tvetydiga fall.
De nya kompilatoralternativen är:
-publicsign
för att aktivera OSS-signering (Open Source Software) för sammansättningar.-pathmap
för att tillhandahålla en mappning för källkataloger.
C# version 7.2
Publicerad november 2017
C# 7.2 har lagt till flera små språkfunktioner:
- Initierare för
stackalloc
matriser. - Använd
fixed
instruktioner med alla typer som stöder ett mönster. - Få åtkomst till fasta fält utan att fästa.
- Tilldela om
ref
lokala variabler. - Deklarera
readonly struct
typer för att indikera att en struct är oföränderlig och ska skickas som enin
parameter till dess medlemsmetoder. in
Lägg till modifieraren för parametrar för att ange att ett argument skickas med referens men inte ändras av den anropade metoden.ref readonly
Använd modifieraren på metodreturer för att ange att en metod returnerar dess värde med referens men inte tillåter skrivningar till objektet.- Deklarera
ref struct
typer för att indikera att en struct-typ kommer åt hanterat minne direkt och måste alltid vara stackallokerad. - Använd ytterligare allmänna begränsningar.
- Icke-avslutande namngivna argument:
- Positionsargument kan följa namngivna argument.
- Inledande understreck i numeriska literaler:
- Numeriska literaler kan nu ha inledande understreck före eventuella tryckta siffror.
private protected
åtkomstmodifierare:- Åtkomstmodifieraren
private protected
ger åtkomst för härledda klasser i samma sammansättning.
- Åtkomstmodifieraren
- Villkorsstyrda
ref
uttryck:- Resultatet av ett villkorsuttryck (
?:
) kan nu vara en referens.
- Resultatet av ett villkorsuttryck (
C# version 7.1
Publicerad augusti 2017
C# började släppa punktversioner med C# 7.1. Den här versionen lade till konfigurationselementet för val av språkversion , tre nya språkfunktioner och nytt kompilatorbeteende.
De nya språkfunktionerna i den här versionen är:
async
Main
metod- Startpunkten för ett program kan ha
async
modifieraren.
- Startpunkten för ett program kan ha
default
literaluttryck- Du kan använda standardliterala uttryck i standardvärdeuttryck när måltypen kan härledas.
- Anledda tupppelelementnamn
- Namnen på tuppelns element kan härledas från tuppelns initiering i många fall.
- Mönstermatchning på generiska typparametrar
- Du kan använda mönstermatchningsuttryck på variabler vars typ är en allmän typparameter.
Slutligen har kompilatorn två alternativ -refout
och -refonly
den styr referenssammansättningens generering.
C# version 7.0
Publicerad mars 2017
C# version 7.0 släpptes med Visual Studio 2017. Den här versionen har några evolutionära och coola saker i samma anda som C# 6.0. Här är några av de nya funktionerna:
- Utvariabler
- Tupplar och dekonstruktioner
- Mönstermatchning
- Lokala funktioner
- Expanderade uttryckskroppsmedlemmar
- Ref locals
- Referensreturer
Andra funktioner ingår:
Alla dessa funktioner erbjuder nya funktioner för utvecklare och möjlighet att skriva renare kod än någonsin. En markering komprimerar deklarationen av variabler som ska användas med nyckelordet out
och genom att tillåta flera returvärden via tuppeln. .NET Core riktar sig nu mot alla operativsystem och har ögonen på molnet och portabiliteten. Dessa nya funktioner upptar verkligen språkdesignerns tankar och tid, förutom att komma med nya funktioner.
C# version 6.0
Släpptes juli 2015
Version 6.0, som släpptes med Visual Studio 2015, släppte många mindre funktioner som gjorde C#-programmering mer produktiv. Här är några av dem:
- Statisk import
- Undantagsfilter
- Autoegenskapsinitierare
- Uttryckskroppsmedlemmar
- Null-spridning
- Stränginterpolering
- nameof-operator
Andra nya funktioner är:
- Indexinitierare
- Vänta i catch/finally-block
- Standardvärden för egenskaper endast för getter
Om du tittar på de här funktionerna tillsammans ser du ett intressant mönster. I den här versionen började C# eliminera språk pannplate för att göra koden mer terse och läsbar. Så för fans av ren, enkel kod var den här språkversionen en enorm vinst.
De gjorde en annan sak tillsammans med den här versionen, även om det inte är en traditionell språkfunktion i sig. De släppte Kompilatorn Roslyn som en tjänst. C#-kompilatorn är nu skriven i C#, och du kan använda kompilatorn som en del av dina programmeringsinsatser.
C# version 5.0
Utgiven augusti 2012
C# version 5.0, som släpptes med Visual Studio 2012, var en fokuserad version av språket. Nästan all ansträngning för den versionen gick in i ett annat banbrytande språkkoncept: async
och await
modellen för asynkron programmering. Här är den viktigaste funktionslistan:
- Asynkrona medlemmar
- Informationsattribut för uppringare
- Kodprojekt: Informationsattribut för uppringare i C# 5.0
Med attributet caller info kan du enkelt hämta information om kontexten där du kör utan att använda massor av reflektionskod för pannplåt. Den har många användningsområden i diagnostik- och loggningsuppgifter.
Men async
och await
är de verkliga stjärnorna i denna version. När dessa funktioner kom ut 2012 ändrade C# spelet igen genom att baka asynkront till språket som en förstklassig deltagare.
C# version 4.0
Släpptes april 2010
C# version 4.0, som släpptes med Visual Studio 2010, introducerade några intressanta nya funktioner:
- Dynamisk bindning
- Namngivna/valfria argument
- Generiskt covariant och kontravariant
- Inbäddade interoptyper
Inbäddade interoptyper underlättade distributionen av COM-interop-sammansättningar för ditt program. Allmän kovarians och kontravarians ger dig mer makt att använda generiska läkemedel, men de är lite akademiska och förmodligen mest uppskattade av ramverks- och biblioteksförfattare. Med namngivna och valfria parametrar kan du eliminera många metodöverlagringar och underlätta. Men ingen av dessa funktioner är exakt paradigmskifte.
Huvudfunktionen var introduktionen av nyckelordet dynamic
. Nyckelordet dynamic
introducerades i C# version 4.0 möjligheten att åsidosätta kompilatorn vid kompileringstidsskrivning. Genom att använda det dynamiska nyckelordet kan du skapa konstruktioner som liknar dynamiskt skrivna språk som JavaScript. Du kan skapa en dynamic x = "a string"
och sedan lägga till sex till den och lämna den till körningen för att reda ut vad som ska hända härnäst.
Dynamisk bindning ger dig potential för fel men också stor kraft inom språket.
C# version 3.0
Utgiven november 2007
C# version 3.0 kom i slutet av 2007, tillsammans med Visual Studio 2008, även om den fullständiga båten med språkfunktioner faktiskt skulle komma med .NET Framework version 3.5. Den här versionen markerade en stor förändring i tillväxten av C#. Det etablerade C# som ett verkligt formidabelt programmeringsspråk. Låt oss ta en titt på några viktiga funktioner i den här versionen:
- Auto-implementerade egenskaper
- Anonyma typer
- Frågeuttryck
- Lambda-uttryck
- Uttrycksträd
- Tilläggsmetoder
- Implicit inskrivna lokala variabler
- Partiella metoder
- Initiatorer för objekt och samling
I efterhand verkar många av dessa funktioner både oundvikliga och oskiljaktiga. De passar alla ihop strategiskt. Den här C#-versionens mördarfunktion var frågeuttrycket, även kallat Language-Integrated Query (LINQ).
En mer nyanserad vy undersöker uttrycksträd, lambda-uttryck och anonyma typer som grunden som LINQ bygger på. Men i båda fallen presenterade C# 3.0 ett revolutionerande koncept. C# 3.0 började lägga grunden för att göra C# till ett hybridobjektorienterat/funktionellt språk.
Mer specifikt kan du nu skriva deklarativa frågor i SQL-stil för att bland annat utföra åtgärder på samlingar. I stället för att skriva en for
loop för att beräkna medelvärdet av en lista med heltal kan du nu göra det så enkelt som list.Average()
. Kombinationen av frågeuttryck och tilläggsmetoder gjorde en lista över heltal mycket smartare.
C# version 2.0
Släpptes november 2005
Låt oss ta en titt på några viktiga funktioner i C# 2.0, som släpptes 2005, tillsammans med Visual Studio 2005:
- Generika
- Partiella typer
- Anonyma metoder
- Typer av null-värden
- Iteratorer
- Kovarians och kontravarians
Andra C# 2.0-funktioner har lagt till funktioner i befintliga funktioner:
- Separat hjälpmedel för Getter/setter
- Metodgruppkonverteringar (ombud)
- Statiska klasser
- Delegera slutsatsdragning
Medan C# började som ett generiskt objektorienterat språk (OO), ändrade C# version 2.0 det snabbt. Med generiska läkemedel kan typer och metoder fungera på en godtycklig typ samtidigt som typsäkerheten bibehålls. Om du till exempel har en List<T> kan du ha List<string>
eller List<int>
och utföra typsäkra åtgärder på dessa strängar eller heltal medan du itererar genom dem. Det är bättre att använda generiska objekt än att skapa en ListInt
typ som härleds från ArrayList
eller från Object
för varje åtgärd.
C# version 2.0 förde iteratorer. För att uttrycka det kortfattat låter iteratorer dig undersöka alla objekt i en List
(eller andra uppräkningsbara typer) med en foreach
loop. Att ha iteratorer som en förstklassig del av språket förbättrade dramatiskt läsbarheten för språket och människors förmåga att resonera om koden.
C# version 1.2
Släpptes april 2003
C# version 1.2 levereras med Visual Studio .NET 2003. Det innehöll några små förbättringar av språket. Det mest anmärkningsvärda är att koden som genereras i en foreach
loop som anropas Dispose på en IEnumerator när den IEnumerator implementerade IDisposablebörjar med den här versionen.
C# version 1.0
Utgiven januari 2002
När du går tillbaka och tittar såg C# version 1.0, som släpptes med Visual Studio .NET 2002, ut ungefär som Java. Som en del av sina uttalade designmål för ECMA försökte det vara ett "enkelt, modernt, allmänt objektorienterat språk.". På den tiden innebar det att se ut som Java att det uppnådde dessa tidiga designmål.
Men om du ser tillbaka på C# 1.0 nu, skulle du finna dig själv lite yr. Den saknade de inbyggda asynkrona funktionerna och några av de smarta funktionerna kring generiska läkemedel som du tar för givna. Faktum är att den saknade generiska läkemedel helt och hållet. Och LINQ? Inte tillgängligt än. Dessa tillägg skulle ta några år att komma ut.
C# version 1.0 såg ut att vara fråntagen funktioner, jämfört med idag. Du skulle skriva utförlig kod. Men ändå måste du börja någonstans. C# version 1.0 var ett genomförbart alternativ till Java på Windows-plattformen.
De viktigaste funktionerna i C# 1.0 inkluderade:
Artikel som ursprungligen publicerades på NDepend-bloggen, med tillstånd av Erik Dietrich och Patrick Smacchia.