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?
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.
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;
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.
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.
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.