.NET 6 / C# 10 Top features

Le 9-10 novembre seront les jours de la release officielle de visual Studio 2022 , .NEt 6.0 et C# 10 et tout cela se passera pendant la . NET Conf.

Je pense qu’il est important de faire un tour d’horizon des features qui me semblent importantes.

Minimal API

Le principe étant de coder rapidement des API en faisant tout dans le fichier Program.cs. Le fichier Startup.cs ayant disparu , tout est fusionné dans le fichier Program.cs mais tout cela mériterait un article en soit.

Ci-dessus nous avons crée un endpoint GET qui prend en paramètre une chaine de caractère et qui la renvoie en 10 secondes.

DateOnly and TimeOnly Types

Cette feature se passe de commentaire mais va être un véritable plaisir d’avoir des dates ou des Time sans avoir à parser ou à utiliser YourDate.Date ou YourDate.Time.

DateOnly date = DateOnly.MinValue;
Console.WriteLine(date); //Outputs 01/01/0001 (With no Time)

Autre chose intéressante est le fait de pouvoir obtenir la timezone de chaque date comme suit :

DateTime date = DateTime.Now;
Console.WriteLine(date.Kind); //Outputs "Local"

Ces deux types peuvent bien sur encore utiliser .AddHours ou AddDays etc.

LINQ OrDefault Enhancements

.NET 6.0 introduit une subtilité non négligeable pour tous les « OrDefault » qui est la définition d’une valeur par défaut si aucun résultat n’est retourné.

public int? returnDefault()
{
    var listint = new List<int?> { 1, 2, 2 };
    var search = 3;

    var foundValue = listint.FirstOrDefault(x => x == search, -1);
    if (foundValue == -1)
    {
       Console.WriteLine("We couldn't find the value");
    }
    return foundValue;
}

IEnumerable Chunk

Au lieu d’utiliser Skip() et Take() , Microsoft a introduit Chunk() sur les IEnumerable. Cela permet d’écrire des traitements parallèles efficaces.

var list = Enumerable.Range(1, 100);
var chunkSize = 10;
foreach(var chunk in list.Chunk(chunkSize)) //Returns a chunk with the correct size. 
{
    Parallel.ForEach(chunk, (item) =>
    {
        //Do something Parallel here. 
        Console.WriteLine(item);
    });
}

PriorityQueue

Il est maintenant possible de définir un ordre de priorité dans les Queue C# , qui l’eut cru après tant d’années. Les Queues sont des collections avec des définitions précises d’ordre comme FIFO (First in first out) ou LIFO (Last in first out) mais ici nous introduisons un nouveau type de Queue.

using System.Collections.Generic;

PriorityQueue<string, int> queue = new PriorityQueue<string, int>();
queue.Enqueue("Item A", 0);
queue.Enqueue("Item B", 60);
queue.Enqueue("Item C", 2);
queue.Enqueue("Item D", 1);

while (queue.TryDequeue(out string item, out int priority))
{
    Console.WriteLine($"Popped Item : {item}. Priority Was : {priority}");
}

MaxBy et MinBy

Ici cela nous permet de raccourcir la syntaxe de notre code LINQ et d’avoir un code un peu plus lisible.

 List<Person> people = new List<Person>
                {
                    new Person
                    {
                        Name = "John Smith",
                        Age = 20
                    },
                    new Person
                    {
                        Name = "Jane Smith",
                        Age = 30
                    }
                };

            Console.WriteLine(people.MaxBy(x => x.Age)); //Outputs Person (John Smith)
            Console.WriteLine(people.MinBy(x => x.Age)); //Outputs Person (Jane Smith)

Global Using Statements

Ici le principe est simple , c’est de rassembler tous nos « using » dans un seul fichier comme suit :

J’ai essayé de rassembler ces features sur un repo GitHub ici.

Je vous laisse regarder tout cela.

Have fun 😉