Nieuw in C# 12

C# 12 bevat de volgende nieuwe functies. U kunt deze functies proberen met behulp van de nieuwste Versie van Visual Studio 2022 of de .NET 8 SDK.

C# 12 wordt ondersteund op .NET 8. Zie C#-taalversiebeheer voor meer informatie.

U kunt de nieuwste .NET 8 SDK downloaden vanaf de .NET-downloadpagina. U kunt ook Visual Studio 2022 downloaden, waaronder de .NET 8 SDK.

Notitie

We zijn geïnteresseerd in uw feedback over deze functies. Als u problemen ondervindt met een van deze nieuwe functies, maakt u een nieuw probleem in de dotnet-/roslyn-opslagplaats .

Primaire constructors

U kunt nu primaire constructors maken in elke class en struct. Primaire constructors zijn niet langer beperkt tot record typen. Primaire constructorparameters vallen binnen het bereik van de hele hoofdtekst van de klasse. Om ervoor te zorgen dat alle primaire constructorparameters zeker worden toegewezen, moeten alle expliciet gedeclareerde constructors de primaire constructor aanroepen met behulp van this() syntaxis. Door een primaire constructor toe te voegen aan een class voorkomt u dat de compiler een impliciete parameterloze constructor declareren. In een struct, de impliciete parameterloze constructor initialiseert alle velden, inclusief primaire constructorparameters naar het 0-bits patroon.

De compiler genereert alleen openbare eigenschappen voor primaire constructorparameters in record typen of record classrecord struct typen. Niet-recordklassen en -structs willen dit gedrag mogelijk niet altijd voor primaire constructorparameters.

Meer informatie over primaire constructors vindt u in de zelfstudie voor het verkennen van primaire constructors en in het artikel over exemplaarconstructors.

Verzamelingsexpressies

Verzamelingsexpressies introduceren een nieuwe terse-syntaxis om algemene verzamelingswaarden te maken. Het inlijnen van andere verzamelingen in deze waarden is mogelijk met behulp van een spread-operator ...

Er kunnen verschillende verzamelingsachtige typen worden gemaakt zonder externe BCL-ondersteuning te vereisen. Deze typen zijn:

In de volgende voorbeelden ziet u het gebruik van verzamelingsexpressies:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];

// Create a list:
List<string> b = ["one", "two", "three"];

// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];

// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

De spread-operator, in een verzamelingsexpressie, .. vervangt het argument door de elementen uit die verzameling. Het argument moet een verzamelingstype zijn. In de volgende voorbeelden ziet u hoe de spread-operator werkt:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
    Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

De operand van een spread-operator is een expressie die kan worden geïnventariseerd. De spread-operator evalueert elk element van de opsommingsexpressie.

U kunt verzamelingexpressies overal gebruiken waar u een verzameling elementen nodig hebt. Ze kunnen de initiële waarde voor een verzameling opgeven of als argumenten worden doorgegeven aan methoden die verzamelingstypen gebruiken. Meer informatie over verzamelingsexpressies vindt u in het naslagartikel over verzamelingsexpressies of de functiespecificatie.

ref readonly Parameters

C# heeft parameters toegevoegd in als een manier om alleen-lezen verwijzingen door te geven. in met parameters kunnen zowel variabelen als waarden worden gebruikt en kunnen zonder aantekeningen op argumenten worden gebruikt.

De toevoeging van ref readonly parameters maakt meer duidelijkheid mogelijk voor API's die mogelijk parameters of in parameters gebruikenref:

Zie voor meer informatie over ref readonly parameters het artikel over parameteraanpassingen in de taalverwijzing of de kenmerkspecificatie van de ref readonly-parameters .

Standaard lambda-parameters

U kunt nu standaardwaarden definiëren voor parameters in lambda-expressies. De syntaxis en regels zijn hetzelfde als het toevoegen van standaardwaarden voor argumenten aan een methode of lokale functie.

Meer informatie over standaardparameters voor lambda-expressies vindt u in het artikel over lambda-expressies.

Alias elk type

U kunt de using aliasrichtlijn gebruiken om elk type te aliasen, niet alleen benoemde typen. Dit betekent dat u semantische aliassen kunt maken voor tuple-typen, matrixtypen, aanwijzertypen of andere onveilige typen. Zie de functiespecificatie voor meer informatie.

Inlinematrices

Inlinematrices worden gebruikt door het runtimeteam en andere bibliotheekauteurs om de prestaties in uw apps te verbeteren. Met inlinematrices kan een ontwikkelaar een matrix met vaste grootte maken in een struct type. Een struct met een inlinebuffer moet prestatiekenmerken bieden die vergelijkbaar zijn met een onveilige buffer met een vaste grootte. U declareert waarschijnlijk niet uw eigen inlinematrices, maar u gebruikt ze transparant wanneer ze worden weergegeven als System.Span<T> of System.ReadOnlySpan<T> objecten van runtime-API's.

Een inlinematrix wordt als volgt structgedeclareerd:

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
    private int _element0;
}

U gebruikt ze als elke andere matrix:

var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
    buffer[i] = i;
}

foreach (var i in buffer)
{
    Console.WriteLine(i);
}

Het verschil is dat de compiler kan profiteren van bekende informatie over een inlinematrix. U gebruikt waarschijnlijk inlinematrices zoals u ook zou doen met een andere matrix. Zie de taalreferentie struct voor typen voor meer informatie over het declareren van inlinematrices.

Experimenteel kenmerk

Typen, methoden of assembly's kunnen worden gemarkeerd met de System.Diagnostics.CodeAnalysis.ExperimentalAttribute functie om een experimentele functie aan te geven. De compiler geeft een waarschuwing uit als u toegang krijgt tot een methode of een type met aantekeningen bij de ExperimentalAttribute. Alle typen die zijn opgenomen in een assembly die is gemarkeerd met het Experimental kenmerk, zijn experimenteel. Meer informatie vindt u in het artikel over algemene kenmerken die worden gelezen door de compiler of de functiespecificatie.

Interceptors

Waarschuwing

Interceptors zijn een experimentele functie die beschikbaar is in de preview-modus met C# 12. De functie kan onderhevig zijn aan belangrijke wijzigingen of verwijdering in een toekomstige release. Daarom wordt het niet aanbevolen voor productie- of uitgebrachte toepassingen.

Als u interceptors wilt gebruiken, moet het gebruikersproject de eigenschap <InterceptorsPreviewNamespaces>opgeven. Dit is een lijst met naamruimten die onderscheppingspunten mogen bevatten.

Bijvoorbeeld: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

Een interceptor is een methode die declaratief een aanroep naar een onderscheppingsmethode kan vervangen door een aanroep naar zichzelf tijdens het compileren. Deze vervanging vindt plaats door de interceptor de bronlocaties te laten declareren van de aanroepen die worden onderschept. Interceptors bieden een beperkte faciliteit om de semantiek van bestaande code te wijzigen door nieuwe code toe te voegen aan een compilatie, bijvoorbeeld in een brongenerator.

U gebruikt een interceptor als onderdeel van een brongenerator om te wijzigen, in plaats van code toe te voegen aan een bestaande broncompilatie. De brongenerator vervangt aanroepen naar een onderscheppingsmethode door een aanroep naar de interceptormethode .

Als u wilt experimenteren met interceptors, kunt u meer informatie vinden door de functiespecificatie te lezen. Als u de functie gebruikt, moet u op de hoogte blijven van eventuele wijzigingen in de functiespecificatie voor deze experimentele functie. Als de functie is voltooid, voegen we meer richtlijnen toe op deze site.

Zie ook