web-dev-qa-db-fra.com

Opérateur null-conditionnel et interpolation de chaîne en C # 6

La syntaxe opérateur de condition nulle et chaînes interpolées se résout-elle en juste sucre syntaxique ?

L'opérateur conditionnel nul (?.), qui permet le nettoyage du code en réduisant la vérification "excessive" null et les chaînes interpolées (("\{X}, \{Y}")), qui rassemble les arguments et le format, sont de nouvelles fonctionnalités en C # 6.

Est-ce que ceux-ci sont compilés vers leurs homologues indésirables (c'est-à-dire le code laid que nous avons cherché à éviter)?

Je m'excuse pour la question naïve, je n'ai pas la meilleure compréhension des langues en général, mais je suis curieux de savoir s'il serait possible d'exécuter ces fonctionnalités sur, disons, C # 5.

Je sais que c'est le cas avec Java dans certains cas, est-ce vrai aussi avec ces exemples?

18
ChiefTwoPencils

Il n'y a pas de règle générale, elle diffère. Certaines fonctionnalités sont simplement du sucre syntaxique, certaines ajoutent des capacités qui n'étaient pas possibles auparavant, et certaines sont une combinaison des deux.

Sucre syntaxique

  • Interpolation de chaînes - Ceci:

    string result = $"{bar}";
    

    Au lieu de:

    string result = string.Format("{0}", bar);
    
  • Opérateur à propagation nulle (?.) - Ce:

    var result = Foo()?.Length
    

    Au lieu de:

    var temp = Foo();
    var result = (temp != null) ? temp.Length : null;
    

De nouvelles capacités

  • Interpolation de chaînes - Ajoute également la prise en charge de IFormattable à l'aide de FormattedString, c'est donc possible:

    IFormattable result =  $"{bar}"
    
  • Attendre dans catch/enfin - Il est maintenant possible d'utiliser await dans catch et finally blocs:

    try
    {
    }
    catch
    {
        await Task.Delay(1000);
    }
    

Il y a bien sûr plus de fonctionnalités dans les deux catégories, comme les filtres d'exception et les membres d'expression.

31
i3arnon

Comme la plupart des nouvelles fonctionnalités de C # 6.0, l'opérateur conditionnel nul est simplement un raccourci (sucre syntaxique, si vous voulez l'appeler) pour un modèle d'obtention de la valeur d'un membre si l'instance de la variable utilisée n'est pas nulle .

Étant donné un s de type string, ceci:

int? l = s?.Length;

se traduit par:

int? l = s == null ? null : s.Length;

Et il peut être combiné avec l'opérateur de coalescence nul (??):

int l = s?.Length ?? 0;

L'interpolation de chaînes a également commencé comme raccourci pour string.Format mais a évolué vers un modèle qui peut produire un string ou un IFormatble. Veuillez vous référer à spécifications actuelles pour plus d'informations.

Et, soit dit en passant, roslyn est le nom de code de la plate-forme du compilateur, pas les langues ou leurs fonctionnalités.

10
Paulo Morgado

L'opérateur Elvis est très utile lors de l'appel de l'événement RaisePropertyChanged.

Dans le passé, vous écriviez

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}

Mais il y avait un problème potentiel de threads multiples si PropertyChanged était défini sur null avant son appel. Au lieu de cela, vous pouvez écrire:

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));

Ce qui évite complètement le problème du multi-threading - donc ce n'est pas tout à fait du sucre de syntaxe.

2
Peter