Nieuw in .NET 6

.NET 6 levert de laatste onderdelen van het .NET-eenwordingsplan dat is gestart met .NET 5. .NET 6 maakt de SDK, basisbibliotheken en runtime mogelijk voor mobiele apps, desktops, IoT en cloud-apps. Naast deze eenwording biedt het .NET 6-ecosysteem:

  • Vereenvoudigde ontwikkeling: Aan de slag is eenvoudig. Nieuwe taalfuncties in C# 10 verminderen de hoeveelheid code die u moet schrijven. En investeringen in de webstack en minimale API's maken het eenvoudig om kleinere, snellere microservices te schrijven.

  • Betere prestaties: .NET 6 is het snelste volledige stack-webframework, waardoor de rekenkosten worden verlaagd als u in de cloud werkt.

  • Ultieme productiviteit: .NET 6 en Visual Studio 2022 bieden hot-reload, nieuwe git-hulpprogramma's, intelligente codebewerking, robuuste diagnostische en testhulpprogramma's en betere teamsamenwerking.

.NET 6 wordt drie jaar ondersteund als een lts-release (long-term support).

Preview-functies zijn standaard uitgeschakeld. Ze worden ook niet ondersteund voor gebruik in productie en kunnen in een toekomstige versie worden verwijderd. Het nieuwe RequiresPreviewFeaturesAttribute wordt gebruikt om aantekeningen te maken bij preview-API's en een bijbehorende analysewaarschuwing als u deze preview-API's gebruikt.

.NET 6 wordt ondersteund door Visual Studio 2022 en Visual Studio 2022 voor Mac (en latere versies).

In dit artikel worden niet alle nieuwe functies van .NET 6 behandeld. Als u alle nieuwe functies wilt zien en voor meer informatie over de functies die in dit artikel worden vermeld, raadpleegt u het blogbericht .NET 6 .

Prestaties

.NET 6 bevat talloze prestatieverbeteringen. In deze sectie vindt u enkele verbeteringen: in FileStream, profielgestuurde optimalisatie en AOT-compilatie. Zie de blogpost over prestatieverbeteringen in .NET 6 voor gedetailleerde informatie.

Filestream

Het System.IO.FileStream type is herschreven voor .NET 6 om betere prestaties en betrouwbaarheid in Windows te bieden. FileStream Blokkeert nu nooit wanneer deze is gemaakt voor asynchrone I/O in Windows. Zie het blogbericht File IO in .NET 6 voor meer informatie.

Optimalisatie met profielgestuurd

Met profielgestuurde optimalisatie (PGO) genereert de JIT-compiler geoptimaliseerde code in termen van de typen en codepaden die het meest worden gebruikt. .NET 6 introduceert dynamische PGO. Dynamische PGO werkt hand-in-hand met gelaagde compilatie om code verder te optimaliseren op basis van extra instrumentatie die wordt uitgevoerd tijdens laag 0. Dynamische PGO is standaard uitgeschakeld, maar u kunt deze inschakelen met de DOTNET_TieredPGOomgevingsvariabele. Zie JIT-prestatieverbeteringen voor meer informatie.

Crossgen2

.NET 6 introduceert Crossgen2, de opvolger van Crossgen, die is verwijderd. Crossgen en Crossgen2 zijn hulpprogramma's die vooraf (AOT) compilatie bieden om de opstarttijd van een app te verbeteren. Crossgen2 is geschreven in C# in plaats van C++, en kan analyses en optimalisatie uitvoeren die niet mogelijk waren met de vorige versie. Zie Gesprek over Crossgen2 voor meer informatie.

Arm64-ondersteuning

De .NET 6-release bevat ondersteuning voor macOS Arm64 (of 'Apple Silicon') en Windows Arm64-besturingssystemen, voor zowel systeemeigen Arm64-uitvoering als x64-emulatie. Bovendien worden de x64- en Arm64 .NET-installatieprogramma's naast elkaar geïnstalleerd. Zie .NET-ondersteuning voor macOS 11 en Windows 11 voor Arm64 en x64 voor meer informatie.

Dynamisch opnieuw laden

Hot reload is een functie waarmee u de broncode van uw app kunt wijzigen en deze wijzigingen direct kunt toepassen op uw actieve app. Het doel van de functie is om uw productiviteit te verhogen door te voorkomen dat de app opnieuw wordt opgestart tussen bewerkingen. Hot reload is beschikbaar in Visual Studio 2022 en het dotnet watch opdrachtregelprogramma. Hot reload werkt met de meeste typen .NET-apps en voor C#, Visual Basic en C++-broncode. Zie de blogpost Hot reload voor meer informatie.

.NET MAUI

.NET Multi-Platform App UI (.NET TENANT) is nog in preview, met een releasekandidaat in het eerste kwartaal van 2022 en algemene beschikbaarheid (GA) in het tweede kwartaal van 2022. .NET MAUI maakt het mogelijk om systeemeigen client-apps te bouwen voor desktop- en mobiele besturingssystemen met één codebasis. Zie de blogpost Update op .NET Multi-platform App UI voor meer informatie.

C# 10 en sjablonen

C# 10 bevat innovaties zoals global using instructies, declaraties van bestandsbereiken en recordstructs. Zie Wat is er nieuw in C# 10 voor meer informatie.

In combinatie met dat werk zijn de .NET SDK-projectsjablonen voor C# gemoderniseerd om enkele van de nieuwe taalfuncties te gebruiken:

  • async Main Methode
  • Instructies op het hoogste niveau
  • Door het doel getypte nieuwe expressies
  • Impliciete global using instructies
  • Naamruimten met bestandsbereik
  • Null-verwijzingstypen

Door deze nieuwe taalfuncties toe te voegen aan de projectsjablonen, begint de nieuwe code met de functies ingeschakeld. Bestaande code wordt echter niet beïnvloed wanneer u een upgrade uitvoert naar .NET 6. Zie voor meer informatie over deze sjabloonwijzigingen de .NET SDK: C#-projectsjablonen, gemoderniseerd blogbericht .

F# en Visual Basic

F# 6 voegt verschillende verbeteringen toe aan de F#-taal en F# Interactive. Zie Wat is er nieuw in F# 6 voor meer informatie.

Visual Basic heeft verbeteringen in de Visual Studio-ervaring en het opstarten van het Windows Forms-project.

SDK-workloads

Om de grootte van de .NET SDK kleiner te houden, zijn sommige onderdelen in nieuwe, optionele SDK-workloads geplaatst. Deze onderdelen omvatten .NET MAUI en Blazor WebAssembly AOT. Als u Visual Studio gebruikt, wordt ervoor gezorgd dat u SDK-workloads installeert die u nodig hebt. Als u de .NET CLI gebruikt, kunt u workloads beheren met behulp van de nieuwe dotnet workload opdrachten:

Opdracht Beschrijving
zoeken in dotnet-werkbelasting Zoekt naar beschikbare workloads.
dotnet-workload installeren Hiermee wordt een opgegeven workload geïnstalleerd.
dotnet-workload verwijderen Hiermee verwijdert u een opgegeven workload.
dotnet-werkbelasting bijwerken Hiermee worden geïnstalleerde workloads bijgewerkt.
dotnet-workloadherstel Installeert alle geïnstalleerde workloads opnieuw om een defecte installatie te herstellen.
lijst met dotnet-werkbelastingen Een lijst met geïnstalleerde workloads.

Zie Optionele SDK-workloads voor meer informatie.

System.Text.Json-API's

Er zijn veel verbeteringen aangebracht in System.Text.Json .NET 6, zodat het nu een serialisatieoplossing voor industriële sterkte is.

Brongenerator

.NET 6 voegt een nieuwe brongenerator toe voor System.Text.Json. Het genereren van bronnen werkt met JsonSerializer en kan op meerdere manieren worden geconfigureerd. Het kan de prestaties verbeteren, het geheugengebruik verminderen en het bijsnijden van assembly's vergemakkelijken. Zie Reflectie of brongeneratie kiezen in System.Text.Json en het gebruik van brongeneratie in System.Text.Json voor meer informatie.

Schrijfbare DOM

Er is een nieuw documentobjectmodel (DOM) toegevoegd dat een aanvulling vormt op de bestaande alleen-lezen DOM. De nieuwe API biedt een lichtgewicht serialisatie alternatief voor gevallen waarin het gebruik van gewone oude CLR-objecttypen (POCO) niet mogelijk is. Hiermee kunt u ook efficiënt naar een subsectie van een grote JSON-structuur navigeren en een matrix lezen of een POCO deserialiseren vanuit die subsectie. De volgende nieuwe typen zijn toegevoegd ter ondersteuning van de schrijfbare DOM:

Zie JSON DOM-opties voor meer informatie.

IAsyncEnumerable serialisatie

System.Text.Json ondersteunt nu serialisatie en deserialisatie met IAsyncEnumerable<T> exemplaren. Asynchrone serialisatiemethoden inventariseren alle IAsyncEnumerable<T> exemplaren in een objectgrafiek en serialiseren ze vervolgens als JSON-matrices. Voor deserialisatie is de nieuwe methode JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) toegevoegd. Zie IAsyncEnumerable serialisatie voor meer informatie.

Andere nieuwe API's

Nieuwe serialisatie-interfaces voor validatie en standaardwaarden:

Zie Callbacks voor meer informatie.

Nieuw kenmerk voor het ordenen van eigenschappen:

Nieuwe methode voor het schrijven van onbewerkte JSON:

Synchrone serialisatie en deserialisatie naar een stroom:

Nieuwe optie om een object te negeren wanneer een referentiecyclus wordt gedetecteerd tijdens serialisatie:

Zie JSON-serialisatie en deserialisatie in .NET voor meer informatie over serialiseren en deserialisatieSystem.Text.Json.

HTTP/3

.NET 6 bevat preview-ondersteuning voor HTTP/3, een nieuwe versie van HTTP. HTTP/3 lost een aantal bestaande functionele en prestatieproblemen op met behulp van een nieuw onderliggend verbindingsprotocol met de naam QUIC. QUIC brengt sneller verbindingen tot stand en verbindingen zijn onafhankelijk van het IP-adres, zodat mobiele clients kunnen roamen tussen wi-fi en mobiele netwerken. Zie HTTP/3 gebruiken met HttpClient voor meer informatie.

ASP.NET Core

ASP.NET Core bevat verbeteringen in minimale API's, vooraf uitgevoerde compilatie (AOT) voor Blazor WebAssembly-apps en apps met één pagina. Bovendien kunnen Blazor-onderdelen nu worden weergegeven vanuit JavaScript en worden geïntegreerd met bestaande Op JavaScript gebaseerde apps. Zie Wat is er nieuw in ASP.NET Core 6 voor meer informatie.

OpenTelemetry

.NET 6 biedt verbeterde ondersteuning voor OpenTelemetry, een verzameling hulpprogramma's, API's en SDK's waarmee u de prestaties en het gedrag van uw software kunt analyseren. API's in de System.Diagnostics.Metrics naamruimte implementeren de API-specificatie voor metrische gegevens van OpenTelemetry. Er zijn bijvoorbeeld vier instrumentklassen ter ondersteuning van verschillende metrische scenario's. De instrumentklassen zijn:

Beveiliging

.NET 6 voegt preview-ondersteuning toe voor twee belangrijke beveiligingsbeperkende oplossingen: Control-flow Enforcement Technology (CET) en 'write exclusive execute' (W^X).

CET is een Intel-technologie die beschikbaar is in een aantal nieuwere Intel- en AMD-processors. Het voegt mogelijkheden toe aan de hardware die bescherming biedt tegen bepaalde hijacking-aanvallen voor controlestromen. .NET 6 biedt ondersteuning voor CET voor Windows x64-apps en u moet deze expliciet inschakelen. Zie .NET 6-compatibiliteit met Intel CET-schaduwstacks voor meer informatie.

W^X is beschikbaar voor alle besturingssystemen met .NET 6, maar alleen standaard ingeschakeld op Apple Silicon. W^X blokkeert het eenvoudigste aanvalspad door het ongedaan maken van de toewijzing van geheugenpagina's om tegelijkertijd schrijfbaar en uitvoerbaar te zijn.

IL-bijsnijding

Het bijsnijden van zelf-ingesloten implementaties wordt verbeterd. In .NET 5 zijn alleen ongebruikte assembly's ingekort. .NET 6 voegt ook het bijsnijden van ongebruikte typen en leden toe. Bovendien worden knipwaarschuwingen, waarmee u wordt gewaarschuwd op plaatsen waar bijsnijden code die tijdens runtime wordt gebruikt, standaard worden ingeschakeld . Zie Self-Ingesloten implementaties en uitvoerbare bestanden knippen voor meer informatie.

Codeanalyse

De .NET 6 SDK bevat een aantal nieuwe codeanalyses die betrekking hebben op API-compatibiliteit, platformcompatibiliteit, het beperken van de veiligheid, het gebruik van spanwijdte in tekenreekssamenvoeging en splitsing, snellere tekenreeks-API's en snellere verzameling-API's. Zie Analyzer-releases - .NET 6 voor een volledige lijst met nieuwe (en verwijderde) analyses.

Aangepaste platformbeveiligingen

De platformcompatibiliteitsanalyse herkent de Is<Platform> methoden in de OperatingSystem klasse, bijvoorbeeld als OperatingSystem.IsWindows()platformbeveiliging. Als u aangepaste platformbeveiligingen wilt toestaan, introduceert .NET 6 twee nieuwe kenmerken die u kunt gebruiken om aantekeningen te maken op velden, eigenschappen of methoden met een ondersteunde of niet-ondersteunde platformnaam:

Windows Forms

Application.SetDefaultFont(Font) is een nieuwe methode in .NET 6 waarmee het standaardlettertype in uw toepassing wordt ingesteld.

De sjablonen voor C# Windows Forms-apps zijn bijgewerkt ter ondersteuning global using van richtlijnen, naamruimten met bestandsbereik en null-verwijzingstypen. Daarnaast bevatten ze toepassingsbootcode, waardoor standaardcode wordt verminderd en de Ontwerpfunctie van Windows Forms het ontwerpoppervlak in het voorkeurslettertype kan weergeven. De bootstrap-code is een aanroep naar ApplicationConfiguration.Initialize(), een door de bron gegenereerde methode waarmee aanroepen naar andere configuratiemethoden worden verzonden, zoals Application.EnableVisualStyles(). Als u bovendien een niet-standaardlettertype instelt via de eigenschap ApplicationDefaultFont MSBuild, ApplicationConfiguration.Initialize() verzendt u een aanroep naar SetDefaultFont(Font).

Zie het blogbericht Wat is er nieuw in Windows Forms voor meer informatie.

Bronbuild

De bron tarball, die alle bron voor de .NET SDK bevat, is nu een product van de .NET SDK-build. Andere organisaties, zoals Red Hat, kunnen hun eigen versie van de SDK bouwen met behulp van deze bron tarball.

Doelframework monikers

Er zijn extra os-specifieke doelframeworks (TFM's) toegevoegd voor .NET 6, bijvoorbeeld net6.0-android, net6.0-iosen net6.0-macos. Zie .NET 5+ OS-specifieke TFM's voor meer informatie.

Algemene wiskunde

In preview is de mogelijkheid om operators te gebruiken voor algemene typen in .NET 6. .NET 6 introduceert talloze interfaces die gebruikmaken van de nieuwe preview-functie van C# 10, static abstract interfaceleden. Deze interfaces komen overeen met verschillende operators, bijvoorbeeld, IAdditionOperators vertegenwoordigen de + operator. De interfaces zijn beschikbaar in het System.Runtime.Experimental NuGet-pakket. Zie het blogbericht Algemene wiskunde voor meer informatie.

NuGet-pakketvalidatie

Als u een NuGet-bibliotheekontwikkelaar bent, kunt u met nieuwe hulpprogramma's voor pakketvalidatie controleren of uw pakketten consistent en goed zijn opgemaakt. U kunt bepalen of:

  • Er zijn belangrijke wijzigingen in pakketversies.
  • Het pakket heeft dezelfde set openbare API's voor alle runtimespecifieke implementaties.
  • Er zijn hiaten voor doelframework of runtime-toepasbaarheid.

Zie het blogbericht Pakketvalidatie voor meer informatie.

Reflectie-API's

.NET 6 introduceert de volgende nieuwe API's die code inspecteren en informatie over null-functionaliteit bieden:

Deze API's zijn handig voor hulpprogramma's en serialisatiefuncties op basis van reflectie.

API's voor Microsoft.Extensions

Verschillende uitbreidingsnaamruimten hebben verbeteringen in .NET 6, zoals in de volgende tabel wordt weergegeven.

Naamruimte Verbeteringen
Microsoft.Extensions.DependencyInjection CreateAsyncScope hiermee kunt u veilig een using instructie gebruiken voor een serviceprovider die een IAsyncDisposable service registreert.
Microsoft.Extensions.Hosting Nieuwe ConfigureHostOptions methoden vereenvoudigen het instellen van toepassingen.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging heeft een nieuwe brongenerator voor performante logboekregistratie-API's. De brongenerator wordt geactiveerd als u de nieuwe LoggerMessageAttribute toevoegt aan een partial logboekregistratiemethode. Tijdens het compileren genereert de generator de implementatie van de partial methode, die doorgaans sneller is tijdens runtime dan bestaande logboekregistratieoplossingen. Zie Compileertijd voor het genereren van bronbronnen voor logboekregistratie voor meer informatie.

Nieuwe LINQ-API's

Er zijn talloze LINQ-methoden toegevoegd in .NET 6. De meeste nieuwe methoden die in de volgende tabel worden vermeld, hebben gelijkwaardige methoden in het System.Linq.Queryable type.

Wijze Description
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Pogingen om het aantal elementen in een reeks te bepalen zonder een opsomming af te dwingen.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Hiermee worden de elementen van een reeks gesplitst in segmenten van een opgegeven grootte.
Enumerable.MaxBy en Enumerable.MinBy Hiermee vindt u maximale of minimale elementen met behulp van een sleutelkiezer.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy en Enumerable.UnionBy Met deze nieuwe variaties van methoden waarmee op set gebaseerde bewerkingen worden uitgevoerd, kunt u gelijkheid opgeven met behulp van een sleutelkiezerfunctie.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) en Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Accepteert indexen die worden geteld vanaf het begin of einde van de reeks, bijvoorbeeld Enumerable.Range(1, 10).ElementAt(^2) retourneert 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) en Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) en Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) en Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Met nieuwe overbelastingen kunt u een standaardwaarde opgeven die moet worden gebruikt als de reeks leeg is.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) en Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Met nieuwe overbelastingen kunt u een vergelijkingsfunctie opgeven.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Hiermee wordt een Range argument geaccepteerd om het nemen van een segment van een reeks te vereenvoudigen, bijvoorbeeld dat u source.Take(2..7) in plaats van source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Produceert een reeks tuples met elementen uit drie opgegeven reeksen.

Verbeteringen in datum, tijd en tijdzone

De volgende twee structs zijn toegevoegd in .NET 6: System.DateOnly en System.TimeOnly. Deze vertegenwoordigen respectievelijk het datumgedeelte en het tijdgedeelte van een DateTime. DateOnly is handig voor verjaardagen en verjaardagen, en TimeOnly is handig voor dagelijkse alarmen en wekelijkse kantooruren.

U kunt nu IANA(Internet Assigned Numbers Authority) of Windows-tijdzone-id's gebruiken op elk besturingssysteem waarop tijdzonegegevens zijn geïnstalleerd. De TimeZoneInfo.FindSystemTimeZoneById(String) methode is bijgewerkt om de invoer van een Windows-tijdzone automatisch te converteren naar een IANA-tijdzone (of omgekeerd) als de aangevraagde tijdzone niet op het systeem wordt gevonden. Daarnaast zijn de nieuwe methoden TryConvertIanaIdToWindowsId(String, String) toegevoegd voor scenario's wanneer u nog steeds handmatig moet converteren van de ene TryConvertWindowsIdToIanaId tijdzone-indeling naar een andere.

Er zijn ook enkele andere verbeteringen in de tijdzone. Zie Datum-, tijd- en tijdzoneverbeteringen in .NET 6 voor meer informatie.

PriorityQueue-klasse

De nieuwe PriorityQueue<TElement,TPriority> klasse vertegenwoordigt een verzameling items met zowel een waarde als een prioriteit. Items worden gedequeueerd in een hogere prioriteitsvolgorde, dat wil gezegd dat het item met de laagste prioriteitswaarde eerst wordt gedequeueerd. Met deze klasse wordt een minimale heap-gegevensstructuur geïmplementeerd.

Zie ook