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.
Primaire constructors : geïntroduceerd in Visual Studio 2022 versie 17.6 Preview 2.
Verzamelingexpressies : geïntroduceerd in Visual Studio 2022 versie 17.7 Preview 5.
Inlinematrices - geïntroduceerd in Visual Studio 2022 versie 17.7 Preview 3.
Optionele parameters in lambda-expressies : geïntroduceerd in Visual Studio 2022 versie 17.5 Preview 2.
ref readonly
parameters : geïntroduceerd in Visual Studio 2022 versie 17.8 Preview 2.Alias elk type - geïntroduceerd in Visual Studio 2022 versie 17.6 Preview 3.
Experimenteel kenmerk - geïntroduceerd in Visual Studio 2022 versie 17.7 Preview 3.
De preview-functie Interceptors - is geïntroduceerd in Visual Studio 2022 versie 17.7 Preview 3.
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 class
record 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:
- Matrixtypen, zoals
int[]
. - System.Span<T> en System.ReadOnlySpan<T>.
- Typen die ondersteuning bieden voor initialisatie van verzamelingen, zoals System.Collections.Generic.List<T>.
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
:
- API's die eerder
in
zijn gemaakt, kunnen worden gebruiktref
, ook al is het argument niet gewijzigd. Deze API's kunnen worden bijgewerkt metref readonly
. Het is geen belangrijke wijziging voor bellers, net als als deref
parameter is gewijzigd inin
. Een voorbeeld is System.Runtime.InteropServices.Marshal.QueryInterface. - API's die een
in
parameter gebruiken, maar logisch een variabele vereisen. Een waardeexpressie werkt niet. Een voorbeeld is System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - API's die gebruikmaken
ref
van een variabele, maar die variabele niet dempen. Een voorbeeld is System.Runtime.CompilerServices.Unsafe.IsNullRef.
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 struct
gedeclareerd:
[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.