Språkhistorik

Referenssida över vad som tillkommit i C# sedan version 4.0 (2010). Tänkt som komplement till ämnessidorna — inte en ersättning. Se Varför C# ser ut som det gör för sammanhanget bakom varför språket utvecklas som det gör.

C# 4.0 — 2010 (.NET Framework 4)

FunktionAnvändning
dynamicSen bindning vid runtime — mest COM-interop
Named/optional parametersMetod(namn: "x", ålder: 5)
Co-/contravariance i genericsIEnumerable<out T>, IComparer<in T>

C# 5.0 — 2012 (.NET Framework 4.5)

FunktionAnvändning
async/awaitAsynkron kod utan trådblockering — se Asynkron
Caller info-attribut[CallerMemberName], [CallerLineNumber] — bra för loggning

C# 6.0 — 2015

FunktionAnvändning
Expression-bodied membersint Kvadrat(int x) => x * x;
Null-conditional operatorperson?.Namn
String interpolation$"Hej {namn}"
nameofnameof(person) — refaktoreringssäkra strängar
Exception filterscatch (Exception e) when (e.Message.Contains("x"))
Auto-property initializerspublic int Ålder { get; set; } = 18;

C# 7.0 — 2017

FunktionAnvändning
Tuples & deconstruction(string namn, int ålder) = Hämta();
Pattern matching (is/switch)if (obj is Person p)
Local functionsHjälpfunktion inuti en metod
out-variabler inlineif (int.TryParse(s, out int tal))
ref returns/localsReturnera referens istället för kopia
Discards_ för ointressanta värden

C# 7.1–7.3 — 2017–2018

FunktionAnvändning
Async Mainstatic async Task Main()
Default literalint x = default;
in-parametrar, readonly struct, ref structVärdesemantik för prestanda
private protectedNy access modifier
Generic constraintsunmanaged, Enum, delegate

C# 8.0 — 2019 (.NET Core 3.0)

FunktionAnvändning
Nullable reference typesstring? vs string — se Nullable typer
Switch expressionsvar x = tal switch { 1 => "ett", _ => "annat" };
using-deklarationerusing var fil = ...; — disposas i slutet av scope
Ranges & indicesarr[1..3], arr[^1]
Async streamsIAsyncEnumerable<T>, await foreach
Default interface methodsImplementation direkt i interface

C# 9.0 — 2020 (.NET 5)

FunktionAnvändning
Recordsrecord Person(string Namn, int Ålder); — immutable data med värdelikhet
Init-only setters{ get; init; } — sätts bara vid objektskapande
Top-level statementsProgram.cs utan Main-boilerplate — se Programstruktur
Target-typed newPerson p = new("Anna", 30);
Pattern matchingRelational (> 10) och logiska (and/or/not) patterns

C# 10 — 2021 (.NET 6)

FunktionAnvändning
Record structsRecords med värdesemantik istället för referenssemantik
Global usingEn using-fil täcker hela projektet
File-scoped namespacenamespace Foo; utan block, en indenteringsnivå mindre
CallerArgumentExpressionFångar uttrycket som skickades in, t.ex. för assert-meddelanden

C# 11 — 2022 (.NET 7)

FunktionAnvändning
Raw string literals"""...""" — strängar med citattecken/backslash utan escaping
Required membersrequired string Namn; — måste sättas vid objektskapande
Generic mathstatic abstract medlemmar i interfaces
List patternsif (arr is [1, 2, ..])
UTF-8 string literals"text"u8

C# 12 — 2023 (.NET 8)

FunktionAnvändning
Primary constructorsclass Person(string namn, int ålder) — även för klasser, inte bara records
Collection expressionsint[] arr = [1, 2, 3]; med spread [..a, ..b]
Default lambda-parametrar(int x = 5) => x * 2
Alias any typeusing Point = (int x, int y);

C# 13 — 2024 (.NET 9)

FunktionAnvändning
params-collectionsparams IEnumerable<int> — inte bara array längre
Nytt lock-objektSystem.Threading.Lock — snabbare än lock på object
Partial properties/indexersDela deklaration/implementation, t.ex. för källgenererad kod
\e-escapeEscape-tecken i strängar

C# 14 — 2025 (.NET 10)

FunktionAnvändning
Extension membersNytt extension-block-syntax för metoder/properties/statics
field-nyckelordetÅtkomst till kompilatorgenererat backing field i en property
Null-conditional assignmentperson?.Namn = "Anna";
Implicit span conversionsMindre friktion mellan array och Span<T>

C# 15 — preview, GA nov 2026 (.NET 11)

Preview 7 (aug 2026). Listan kan växa fram till GA.

FunktionAnvändning
Union typespublic union Pet(Cat, Dog, Bird); — värdet är exakt en av de angivna typerna, med exhaustive pattern matching i switch
Collection expression argumentsUtökning av [...]-syntaxen (C# 12) med argument till collection-initialiseringen
Closed hierarchiesclosed-modifierare på en klass — låser vilka typer som får ärva den inom samma assembly, gör switch exhaustive utan default
Extension indexersIndexers (obj[i]) kan definieras via extension members
Labeled break/continuebreak label;/continue label; — hoppa ur nästlade loopar utan flaggvariabler
Memory safety (unsafe-modell)Första previewen av en uppdaterad unsafe-modell

Not implementerat / droppat — bra att veta om

!!-operatorn för parameternull-check (void M(string name!!)) var föreslagen till C# 11 men droppades efter negativ feedback. Ersattes av ArgumentNullException.ThrowIfNull(param) (.NET 6, BCL-metod — inte språksyntax).

TL;DR

Varje ny C#-version löser antingen ett skrivbördeproblem (mindre boilerplate) eller ett säkerhetsproblem (nullable, required members). Ingen enskild version är “den stora” — förändringarna är kumulativa.