Microsoft donne un aperçu de C# 8.0

Par:
fredericmazue

mer, 14/11/2018 - 15:43

Dans un billet donne un aperçu des nouvelles fonctionnalités de C# 8.0 et indique que cette mouture du langage viendra avec .NET Core 3.0. Toutefois certaines des nouvelles fonctionnalités de C# 8.0 commenceront à prendre vie dans les préversions de Visual Studio 2019. Voici quelques-unes de ces nouvelles fonctionnalités :

Les types de références 'nullable'

Une des nouveautés majeures de C# 8.0 est l'arrivée des types de références nullables qui vous aideront à en finir avec les exceptions 'null reference' qui empoisonnent la programmation objet depuis un demi siècle, selon les termes de Microsoft.

Ainsi vous ne pourrez plus affecter null à des références de types ordinaires tels que string par exemple :

string s = null; // Warning: Assignment of null to non-nullable reference type

On peut se demander pourquoi le compilateur génère ici un avertissement et non une erreur ? Parce que cette nouvelle approche va casser du code existant et Microsoft souhaite que la transition se fasse en douceur.

Si voulez pouvoir affecter null, alors vous devez utiliser un type de référence nullable, comme ceci :

string? s = null; // Ok  

Si votre code travaille ensuite avec une référence nullable, il doit la tester :

void M(string? s)
{
    Console.WriteLine(s.Length); // Warning: Possible null reference exception
    if (s != null)
    {
        Console.WriteLine(s.Length); // Ok: You won't get here if s is null
    }
}

Si la référence est utilisé en dehors du test, le compilateur émet un avertissement.

Les flux asynchrones

La fonctionnalité async / wait de C # 5.0 vous permet de consommer ou produire des résultats asynchrones avec un code simple, sans fonction de rappel. Mais, comme le souligne Microsoft, cela n'est pas très utile si vous voulez consommer (ou produire) des flux continus de résultats tels que ceux que vous pouvez obtenir d'un appareil IoT ou d'un service cloud. Les flux asynchrones sont désormais là pour ça. Microsoft introduit le type IAsyncEnumerable<T> qui est exactement ce dont vous avez besoin, à savoir une version asynchrone de IEnumerable<T>. Vous pouvez consommer les éléments d'un flux avec await foreach et les produire avec yield return, comme ceci :

async IAsyncEnumerable<int> GetBigResultsAsync()
{
    await foreach (var result in GetResultsAsync())
    {
        if (result > 20) yield return result;
    }
}

Les types Index et Range

Microsoft introduit le type Index, qui comme son nom l'indique, permet d'accéder à un élément de tableau. Un type Index s'instance à partir d'une valeur entière (int) et peux indexer un tableau depuis son début ou sa fin :

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end

int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

Du type Index découle le type Range qui permet d'obtenir une tranche de données d'un tableau :

var slice = a[i1..i2]; // { 3, 4, 5 }

Microsoft indique que toutes ces nouvelles fonctionnalités de C# 8.0 seront disponibles sur toutes les plates-formes qui implémenteront le standard .NET 2.1. Ce sera le cas de NET Core 3.0, Xamarin, Unity et Mono. Par contre ce ne sera pas le cas de .Net Framework 4.8. Cela signifie que les types requis pour utiliser ces fonctionnalités ne seront pas disponibles lorsque vous ciblerez C # 8.0 sur .NET Framework 4.8.