Microsoft pr�sente un aper�u de trois nouvelles fonctionnalit�s de C# 12, dont les constructeurs primaires pour les classes ou les structures et la d�finition d'alias pour tous les types
Nous sommes ravis de pr�senter en avant-premi�re trois nouvelles fonctionnalit�s de C# 12 :
- Constructeurs primaires pour les classes et les structures non enregistr�es
- Utilisation d'alias pour n'importe quel type
- Valeurs par d�faut pour les param�tres des expressions lambda
Pour tester vous-m�me ces fonctionnalit�s, vous pouvez t�l�charger la derni�re version pr�liminaire de Visual Studio 17.6 ou la derni�re version pr�liminaire de .NET 8.
Constructeurs primaires pour les classes et les structures non enregistr�es
Les constructeurs primaires vous permettent d'ajouter des param�tres � la d�claration de la classe elle-m�me et d'utiliser ces valeurs dans le corps de la classe. Par exemple, vous pouvez utiliser les param�tres pour initialiser les propri�t�s ou dans le code des m�thodes et des accesseurs de propri�t�. Les constructeurs primaires ont �t� introduits pour les enregistrements en C# 9 dans le cadre de la syntaxe positionnelle des enregistrements. C# 12 les �tend � toutes les classes et structures.
La syntaxe de base et l'utilisation d'un constructeur primaire sont les suivantes :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 public class Student(int id, string name, IEnumerable<decimal> grades) { public Student(int id, string name) : this(id, name, Enumerable.Empty<decimal>()) { } public int Id => id; public string Name { get; set; } = name.Trim(); public decimal GPA => grades.Any() ? grades.Average() : 4.0m; }
Les param�tres du constructeur primaire de la classe Student ci-dessus sont disponibles dans tout le corps de la classe. L'une des fa�ons de les utiliser est d'initialiser les propri�t�s. Contrairement aux enregistrements, les propri�t�s ne sont pas automatiquement cr��es pour les param�tres du constructeur primaire dans les classes et les structures sans enregistrement. Cela s'explique par le fait que les classes et les structures non enregistr�es sont souvent plus complexes que les enregistrements, car elles combinent des donn�es et un comportement. Par cons�quent, elles ont souvent besoin de param�tres de construction qui ne doivent pas �tre expos�s. La cr�ation explicite de propri�t�s permet de savoir quelles donn�es sont expos�es, ce qui est conforme � l'utilisation courante des classes. Les constructeurs primaires permettent d'�viter de d�clarer des champs priv�s et de faire en sorte que des corps de constructeurs triviaux attribuent des valeurs de param�tres � ces champs.
Lorsque les param�tres du constructeur primaire sont utilis�s dans des m�thodes ou des accesseurs de propri�t� (le param�tre grades dans la classe Student), ils doivent �tre captur�s afin de rester pr�sents apr�s l'ex�cution du constructeur. Ceci est similaire � la fa�on dont les param�tres et les variables locales sont captur�s dans les expressions lambda. Pour les param�tres du constructeur primaire, la capture est mise en �uvre en g�n�rant un champ de soutien priv� sur la classe ou la structure elle-m�me. Le champ a un nom "unspeakable", ce qui signifie qu'il n'entrera pas en collision avec d'autres noms et qu'il n'est pas �vident par r�flexion. R�fl�chissez � la mani�re dont vous affectez et utilisez les param�tres du constructeur primaire afin d'�viter le double stockage. Par exemple, name est utilis� pour initialiser l'auto-propri�t� Name, qui poss�de son propre champ d'appui. Si un autre membre faisait directement r�f�rence au param�tre name, ce dernier serait �galement stock� dans son propre champ de sauvegarde, ce qui entra�nerait une duplication regrettable.
Une classe dot�e d'un constructeur primaire peut avoir des constructeurs suppl�mentaires. Ces derniers doivent utiliser un initialisateur this(...) pour appeler un autre constructeur sur la m�me classe ou structure. Cela permet de s'assurer que le constructeur primaire est toujours appel� et que toutes les donn�es n�cessaires � la cr�ation de la classe sont pr�sentes. Une structure poss�de toujours un constructeur sans param�tre. Le constructeur implicite sans param�tre n'utilise pas d'initialisateur this()pour appeler le constructeur primaire. Dans le cas d'une struct, vous devez �crire un constructeur sans param�tre explicite pour faire en sorte que le constructeur primaire soit appel�.
Directives d'utilisation pour les types suppl�mentaires
C# 12 �tend la prise en charge des directives d'utilisation � n'importe quel type. Voici quelques exemples :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 using Measurement = (string, int); using PathOfPoints = int[]; using DatabaseInt = int?;
Il est d�sormais possible de d�finir des alias pour presque tous les types. Vous pouvez cr�er des alias pour les types valeur nullable, mais vous ne pouvez pas cr�er d'alias pour les types r�f�rence nullable. Les tuples sont particuli�rement int�ressants car ils permettent d'inclure des noms et des types d'�l�ments :
Code : S�lectionner tout - Visualiser dans une fen�tre � part using Measurement = (string Units, int Distance);
Vous pouvez utiliser des alias partout o� vous utiliseriez un type, par exemple :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 public void F(Measurement x) { }
Les alias vous permettent de faire abstraction des types que vous utilisez et de donner des noms conviviaux � des noms g�n�riques longs ou confus. Cela peut faciliter la lecture de votre code.
Valeurs par d�faut pour les expressions lambda
C# 12 franchit une nouvelle �tape dans l'autonomisation des expressions lambda en vous permettant de sp�cifier des valeurs par d�faut pour les param�tres. La syntaxe est la m�me que pour les autres param�tres par d�faut :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 var addWithDefault = (int addTo = 2) => addTo + 1; addWithDefault(); // 3 addWithDefault(5); // 6
Comme pour les autres valeurs par d�faut, la valeur par d�faut sera �mise dans les m�tadonn�es et sera disponible par r�flexion en tant que DefaultValue du ParameterInfo de la propri�t� Method de l'expression lambda. Par exemple :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 var addWithDefault = (int addTo = 2) => addTo + 1; addWithDefault.Method.GetParameters()[0].DefaultValue; // 2
Avant C# 12, vous deviez utiliser une fonction locale ou la difficile DefaultParameterValue de l'espace de noms System.Runtime.InteropServices pour fournir une valeur par d�faut aux param�tres de l'expression lambda. Ces approches fonctionnent toujours, mais elles sont plus difficiles � lire et ne sont pas coh�rentes avec les valeurs par d�faut des m�thodes. Avec les nouvelles valeurs par d�faut des lambdas, vous aurez un aspect coh�rent pour les valeurs des param�tres par d�faut des m�thodes, des constructeurs et des expressions lambda.
Prochaines �tapes
Nous esp�rons que vous t�l�chargerez l'aper�u et que vous d�couvrirez ces fonctionnalit�s. Nous exp�rimentons en C# 12 avec un num�ro d�di� pour chaque fonctionnalit�. Nous esp�rons que cela permettra de concentrer les commentaires et de faciliter l'adoption de ce que les autres disent.
Nous attendons vos commentaires avec impatience !
Source : Microsoft
Et vous ?
Que pensez-vous de ces nouvelles fonctionnalit�s de C# 12 ?
Voir aussi
Un premier aper�u des fonctionnalit�s de C# 11 est disponible avec la v�rification des param�tres null, et les motifs de liste
Microsoft annonce la sortie de C# 10 dans le cadre de .NET 6 et Visual Studio 2022. C# 10 apporte des am�liorations aux expressions lambda et plusieurs fonctionnalit�s
Une nouvelle Preview de C# 11 est disponible et s'accompagne d'une am�lioration de l'initialisation des objets, ainsi que du support math�matique g�n�rique
Partager