Nyheter i .NET 6

.NET 6 levererar de sista delarna i .NET-sammanslagningsplanen som började med .NET 5. .NET 6 förenar SDK, basbibliotek och körning i mobilappar, skrivbord, IoT och molnappar. Utöver den här återföreningen erbjuder .NET 6-ekosystemet:

  • Förenklad utveckling: Det är enkelt att komma igång. Nya språkfunktioner i C# 10 minskar mängden kod som du behöver skriva. Och investeringar i webbstacken och minimala API:er gör det enkelt att snabbt skriva mindre, snabbare mikrotjänster.

  • Bättre prestanda: .NET 6 är det snabbaste webbramverket för fullständig stack, vilket sänker beräkningskostnaderna om du kör i molnet.

  • Ultimat produktivitet: .NET 6 och Visual Studio 2022 ger snabb omladdning, nya git-verktyg, intelligent kodredigering, robusta diagnostik- och testverktyg och bättre teamsamarbete.

.NET 6 kommer att stödjas i tre år som en långsiktig supportversion (LTS).

Förhandsgranskningsfunktioner är inaktiverade som standard. De stöds inte heller för användning i produktion och kan tas bort i en framtida version. Det nya RequiresPreviewFeaturesAttribute används för att kommentera förhandsversions-API:er och en motsvarande analysator varnar dig om du använder dessa förhandsversions-API:er.

.NET 6 stöds av Visual Studio 2022 och Visual Studio 2022 för Mac (och senare versioner).

Den här artikeln beskriver inte alla nya funktioner i .NET 6. Om du vill se alla nya funktioner och mer information om de funktioner som anges i den här artikeln kan du läsa blogginlägget Om .NET 6 .

Prestanda

.NET 6 innehåller många prestandaförbättringar. I det här avsnittet visas några av förbättringarna – i FileStream, profilstyrd optimering och AOT-kompilering. Detaljerad information finns i blogginlägget Prestandaförbättringar i .NET 6 .

Filestream

Typen System.IO.FileStream har skrivits om för .NET 6 för att ge bättre prestanda och tillförlitlighet i Windows. FileStream Nu blockeras aldrig när de skapas för asynkron I/O i Windows. Mer information finns i blogginlägget Fil-I/O-förbättringar i .NET 6 .

Profilstyrd optimering

Profilstyrd optimering (PGO) är den plats där JIT-kompilatorn genererar optimerad kod när det gäller de typer och kodsökvägar som används oftast. .NET 6 introducerar dynamisk PGO. Dynamisk PGO fungerar hand i hand med nivåindelad kompilering för att ytterligare optimera kod baserat på ytterligare instrumentation som införs under nivå 0. Dynamisk PGO är inaktiverad som standard, men du kan aktivera den med DOTNET_TieredPGOmiljövariabeln. Mer information finns i FÖRBÄTTRINGAR av JIT-prestanda.

Crossgen2

.NET 6 introducerar Crossgen2, efterföljare till Crossgen, som har tagits bort. Crossgen och Crossgen2 är verktyg som tillhandahåller AOT-kompilering (i förväg) för att förbättra starttiden för en app. Crossgen2 är skrivet i C# i stället för C++, och kan utföra analyser och optimeringar som inte var möjliga med den tidigare versionen. Mer information finns i Konversation om Crossgen2.

Arm64-stöd

.NET 6-versionen innehåller stöd för macOS Arm64 (eller "Apple Silicon") och Windows Arm64-operativsystem för både intern Arm64-körning och x64-emulering. Dessutom installeras nu installationsprogrammet x64 och Arm64 .NET sida vid sida. Mer information finns i .NET-stöd för macOS 11 och Windows 11 för Arm64 och x64.

Ladda om frekvent

Frekvent omläsning är en funktion som gör att du kan ändra appens källkod och omedelbart tillämpa ändringarna på din app som körs. Funktionens syfte är att öka produktiviteten genom att undvika omstarter av appar mellan redigeringar. Snabb omläsning är tillgängligt i Visual Studio 2022 och kommandoradsverktyget dotnet watch . Frekvent omläsning fungerar med de flesta typer av .NET-appar och för C#, Visual Basic och C++-källkod. Mer information finns i blogginlägget Frekvent ominläsning.

.NET MAUI

.NET Multi-platform App UI (.NET MAUI) är fortfarande i förhandsversion, med en versionskandidat som kommer under första kvartalet 2022 och allmän tillgänglighet (GA) under andra kvartalet 2022. .NET MAUI gör det möjligt att skapa interna klientappar för stationära och mobila operativsystem med en enda kodbas. Mer information finns i blogginlägget Uppdatera på .NET Multi-platform App UI .

C# 10 och mallar

C# 10 innehåller innovationer som global using direktiv, filomfattande namnområdesdeklarationer och poststrukturer. Mer information finns i Nyheter i C# 10.

I samarbete med det arbetet har .NET SDK-projektmallarna för C# moderniserats för att använda några av de nya språkfunktionerna:

  • async Main Metod
  • Instruktioner på den översta nivån
  • Måltypade nya uttryck
  • Implicita global using direktiv
  • Namnområden med filomfattning
  • Referenstyper som kan ogiltigförklaras

Genom att lägga till dessa nya språkfunktioner i projektmallarna börjar ny kod med funktionerna aktiverade. Befintlig kod påverkas dock inte när du uppgraderar till .NET 6. Mer information om dessa malländringar finns i blogginlägget .NET SDK: C#-projektmallar moderniserade .

F# och Visual Basic

F# 6 lägger till flera förbättringar av F#-språket och F# Interactive. Mer information finns i Nyheter i F# 6.

Visual Basic har förbättringar i Visual Studio-upplevelsen och start av Windows Forms-projekt.

SDK-arbetsbelastningar

För att hålla storleken på .NET SDK mindre har vissa komponenter placerats i nya, valfria SDK-arbetsbelastningar. Dessa komponenter inkluderar .NET MAUI och Blazor WebAssembly AOT. Om du använder Visual Studio tar det hand om att installera eventuella SDK-arbetsbelastningar som du behöver. Om du använder .NET CLI kan du hantera arbetsbelastningar med hjälp av de nya dotnet workload kommandona:

Kommando beskrivning
dotnet-arbetsbelastningssökning Söker efter tillgängliga arbetsbelastningar.
dotnet-arbetsbelastningsinstallation Installerar en angiven arbetsbelastning.
avinstallation av dotnet-arbetsbelastning Tar bort en angiven arbetsbelastning.
uppdatering av dotnet-arbetsbelastning Uppdateringar installerade arbetsbelastningar.
reparation av dotnet-arbetsbelastning Installerar om alla installerade arbetsbelastningar för att reparera en trasig installation.
dotnet-arbetsbelastningslista Visar en lista över installerade arbetsbelastningar.

Mer information finns i Valfria SDK-arbetsbelastningar.

API:er för System.Text.Json

Många förbättringar har gjorts i System.Text.Json .NET 6, så att det nu är en serialiseringslösning med "industriell styrka".

Källgenerator

.NET 6 lägger till en ny källgenerator för System.Text.Json. Källgenerering fungerar med JsonSerializer och kan konfigureras på flera sätt. Det kan förbättra prestanda, minska minnesanvändningen och underlätta monteringstrimning. Mer information finns i How to choose reflection or source generation in System.Text.Json and How to use source generation in System.Text.Json .

Skrivbar DOM

En ny, skrivbar dokumentobjektmodell (DOM) har lagts till, vilket kompletterar den befintliga skrivskyddade DOM. Det nya API:et är ett enkelt serialiseringsalternativ för fall där det inte går att använda vanliga gamla CLR-objekttyper (POCO). Du kan också effektivt navigera till ett underavsnitt av ett stort JSON-träd och läsa en matris eller deserialisera en POCO från den underavsnittet. Följande nya typer har lagts till för att stödja skrivbara DOM:

Mer information finns i JSON DOM-val.

IAsyncEnumerable serialisering

System.Text.Json stöder nu serialisering och deserialisering med IAsyncEnumerable<T> instanser. Asynkrona serialiseringsmetoder räknar upp alla IAsyncEnumerable<T> instanser i ett objektdiagram och serialiserar dem sedan som JSON-matriser. För deserialisering har den nya metoden JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) lagts till. Mer information finns i IAsyncEnumerable serialisering.

Andra nya API:er

Nya serialiseringsgränssnitt för validering och standardvärden:

Mer information finns i Återanrop.

Nytt egenskapsordningsattribut:

Ny metod för att skriva "raw" JSON:

Synkron serialisering och deserialisering till en ström:

Nytt alternativ för att ignorera ett objekt när en referenscykel identifieras under serialiseringen:

Mer information om serialisering och deserialisering med System.Text.Jsonfinns i JSON-serialisering och deserialisering i .NET.

HTTP/3

.NET 6 innehåller förhandsversionsstöd för HTTP/3, en ny version av HTTP. HTTP/3 löser vissa befintliga funktions- och prestandautmaningar med hjälp av ett nytt underliggande anslutningsprotokoll med namnet QUIC. QUIC upprättar anslutningar snabbare och anslutningarna är oberoende av IP-adressen, vilket gör att mobila klienter kan växla mellan Wi-Fi- och mobilnät. Mer information finns i Använda HTTP/3 med HttpClient.

ASP.NET Core

ASP.NET Core innehåller förbättringar i minimala API:er, AOT-kompilering (i förväg) för Blazor WebAssembly-appar och ensidesappar. Dessutom kan Blazor-komponenter nu renderas från JavaScript och integreras med befintliga JavaScript-baserade appar. Mer information finns i Nyheter i ASP.NET Core 6.

OpenTelemetry

.NET 6 ger förbättrat stöd för OpenTelemetry, som är en samling verktyg, API:er och SDK:er som hjälper dig att analysera programvarans prestanda och beteende. API:er i System.Diagnostics.Metrics namnområdet implementerar API-specifikationen OpenTelemetry Metrics. Det finns till exempel fyra instrumentklasser som stöder olika måttscenarier. Instrumentklasserna är:

Säkerhet

.NET 6 lägger till förhandsversionsstöd för två viktiga säkerhetsreduceringar: CET (Control-flow Enforcement Technology) och "write exclusive execute" (W^X).

CET är en Intel-teknik som finns i vissa nyare Intel- och AMD-processorer. Den lägger till funktioner i maskinvaran som skyddar mot vissa kapningsattacker med kontrollflöden. .NET 6 har stöd för CET för Windows x64-appar och du måste uttryckligen aktivera det. Mer information finns i .NET 6-kompatibilitet med Intel CET-skuggstackar.

W^X är tillgängligt för alla operativsystem med .NET 6 men aktiveras endast som standard på Apple Silicon. W^X blockerar den enklaste attackvägen genom att inte tillåta att minnessidor kan skrivas och köras samtidigt.

IL-trimning

Trimning av fristående distributioner har förbättrats. I .NET 5 trimmades endast oanvända sammansättningar. .NET 6 lägger till trimning av oanvända typer och medlemmar också. Dessutom är trimvarningar, som varnar dig för platser där trimning kan ta bort kod som används vid körning, nu aktiverade som standard. Mer information finns i Trimma fristående distributioner och körbara filer.

Kodanalys

.NET 6 SDK innehåller en handfull nya kodanalysverktyg som rör API-kompatibilitet, plattformskompatibilitet, trimningssäkerhet, användning av span i strängsammanfogning och delning, snabbare sträng-API:er och snabbare insamlings-API:er. En fullständig lista över nya (och borttagna) analysverktyg finns i Analyzer-versioner – .NET 6.

Anpassade plattformsskydd

Analysatorn för plattformskompatibilitet Is<Platform> identifierar metoderna i OperatingSystem klassen, till exempel OperatingSystem.IsWindows(), som plattformsskydd. För att tillåta anpassade plattformsskydd introducerar .NET 6 två nya attribut som du kan använda för att kommentera fält, egenskaper eller metoder med ett plattformsnamn som stöds eller inte stöds:

Windows Forms

Application.SetDefaultFont(Font) är en ny metod i .NET 6 som anger standardteckensnittet i programmet.

Mallarna för C# Windows Forms-appar har uppdaterats för att stödja global using direktiv, filomfattningsnamnområden och nullbara referenstyper. Dessutom innehåller de programstövlarkod, vilket minskar standardkod och gör att Windows Forms-designern kan återge designytan i önskat teckensnitt. Bootstrap-koden är ett anrop till ApplicationConfiguration.Initialize(), som är en källgenererad metod som sänder anrop till andra konfigurationsmetoder, till exempel Application.EnableVisualStyles(). Om du anger ett teckensnitt som inte är standard via egenskapen ApplicationConfiguration.Initialize() ApplicationDefaultFont MSBuild genererar ett anrop till SetDefaultFont(Font).

Mer information finns i blogginlägget Nyheter i Windows Forms .

Källversion

Källtjärbollen, som innehåller all källa för .NET SDK, är nu en produkt av .NET SDK-versionen. Andra organisationer, till exempel Red Hat, kan skapa sin egen version av SDK:n med hjälp av den här källtarbollen.

Målramverksmonikers

Ytterligare OS-specifika målramverksmonikers (TFM) har lagts till för .NET 6, till exempel net6.0-android, net6.0-iosoch net6.0-macos. Mer information finns i .NET 5+ OS-specifika TFM:er.

Allmän matematik

I förhandsversionen kan du använda operatorer på generiska typer i .NET 6. .NET 6 introducerar många gränssnitt som använder sig av C# 10:s nya förhandsversionsfunktion, static abstract gränssnittsmedlemmar. Dessa gränssnitt motsvarar till exempel IAdditionOperators olika operatorer som representerar operatorn + . Gränssnitten är tillgängliga i NuGet-paketet System.Runtime.Experimental . Mer information finns i blogginlägget Allmän matematik .

Validering av NuGet-paket

Om du är nuget-biblioteksutvecklare kan du med nya verktyg för paketvalidering verifiera att paketen är konsekventa och välformulerade. Du kan avgöra om:

  • Det finns eventuella icke-bakåtkompatibla ändringar i paketversioner.
  • Paketet har samma uppsättning offentliga API:er för alla körningsspecifika implementeringar.
  • Det finns eventuella luckor för målramverk eller körningstillämpbarhet.

Mer information finns i blogginlägget Paketverifiering .

Api:er för reflektion

.NET 6 introducerar följande nya API:er som inspekterar kod och tillhandahåller nullbarhetsinformation:

Dessa API:er är användbara för reflektionsbaserade verktyg och serialiserare.

API:er för Microsoft.Extensions

Flera namnområden för tillägg har förbättringar i .NET 6, vilket visas i följande tabell.

Namnområde Förbättringar
Microsoft.Extensions.DependencyInjection CreateAsyncScope gör att du på ett säkert sätt kan använda en using instruktion för en tjänstleverantör som registrerar en IAsyncDisposable tjänst.
Microsoft.Extensions.Hosting Nya ConfigureHostOptions metoder förenklar programkonfigurationen.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging har en ny källgenerator för högpresterande loggnings-API:er. Källgeneratorn utlöses om du lägger till den nya LoggerMessageAttribute i en partial loggningsmetod. Vid kompileringstillfället genererar generatorn implementeringen av partial metoden, vilket vanligtvis är snabbare vid körning än befintliga loggningslösningar. Mer information finns i Kompilera tidsloggningskällans generering.

Nya LINQ-API:er

Flera LINQ-metoder har lagts till i .NET 6. De flesta av de nya metoderna som anges i följande tabell har motsvarande metoder i System.Linq.Queryable typen.

Metod beskrivning
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Försöker fastställa antalet element i en sekvens utan att tvinga fram en uppräkning.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Delar upp elementen i en sekvens i segment av en angiven storlek.
Enumerable.MaxBy och Enumerable.MinBy Hittar maximala eller minimala element med hjälp av en nyckelväljare.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectByoch Enumerable.UnionBy Med de här nya varianterna av metoder som utför uppsättningsbaserade åtgärder kan du ange likhet med hjälp av en nyckelväljare.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) och Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Accepterar index som räknas från början eller slutet av sekvensen, till exempel Enumerable.Range(1, 10).ElementAt(^2) returnerar 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) och Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) och Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) och Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Med nya överlagringar kan du ange ett standardvärde som ska användas om sekvensen är tom.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) och Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Med nya överlagringar kan du ange en jämförelse.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Accepterar ett Range argument för att förenkla intag av en del av en sekvens, till exempel kan du använda source.Take(2..7) i stället source.Take(7).Skip(2)för .
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Genererar en sekvens med tupplar med element från tre angivna sekvenser.

Förbättringar av datum, tid och tidszon

Följande två structs lades till i .NET 6: System.DateOnly och System.TimeOnly. Dessa representerar datumdelen respektive tidsdelen av en DateTime, respektive . DateOnly är användbart för födelsedagar och årsdagar, och TimeOnly är användbart för dagliga larm och veckovisa kontorstider.

Du kan nu använda antingen Internet Assigned Numbers Authority (IANA) eller Windows tidszons-ID på alla operativsystem som har tidszonsdata installerade. Metoden TimeZoneInfo.FindSystemTimeZoneById(String) har uppdaterats för att automatiskt konvertera indata från en Windows-tidszon till en IANA-tidszon (eller vice versa) om den begärda tidszonen inte hittas i systemet. Dessutom har de nya metoderna TryConvertIanaIdToWindowsId(String, String) och TryConvertWindowsIdToIanaId lagts till för scenarier när du fortfarande behöver konvertera manuellt från ett tidszonsformat till ett annat.

Det finns några andra förbättringar av tidszonen också. Mer information finns i Förbättringar av datum, tid och tidszon i .NET 6.

PriorityQueue-klass

Den nya PriorityQueue<TElement,TPriority> klassen representerar en samling objekt som har både ett värde och en prioritet. Objekten är utqueuerade i ökad prioritetsordning, dvs. objektet med det lägsta prioritetsvärdet dequeued först. Den här klassen implementerar en minsta heap-datastruktur .

Se även