1952 votes

Que signifient deux points d'interrogation ensemble en C# ?

Je suis tombé sur cette ligne de code :

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

Que signifient les deux points d'interrogation, est-ce une sorte d'opérateur ternaire ? C'est difficile à trouver sur Google.

66 votes

C'est définitivement pas un opérateur ternaire - il n'a que deux opérandes ! Il est un peu comme l'opérateur conditionnel (qui est ternaire) mais l'opérateur de coalescence nul est un opérateur binaire.

101 votes

Je l'ai expliqué lors d'un entretien où l'employeur potentiel avait auparavant exprimé des doutes quant à mes compétences en C#, car j'utilisais Java de manière professionnelle depuis un certain temps déjà. Ils n'en avaient jamais entendu parler avant, et n'ont pas remis en question ma connaissance du C# par la suite :)

85 votes

Il n'y a pas eu d'échec aussi épique dans la reconnaissance des compétences depuis le gars qui a refusé les Beatles :-) A partir de maintenant, envoyez-leur une copie de votre livre avec un lien url vers votre profil SO écrit sur la couverture intérieure.

2575voto

lc. Points 50297

Il s'agit de l'opérateur de coalescence des nuls, qui ressemble beaucoup à l'opérateur ternaire (immédiatement si). Voir aussi ? ? Opérateur - MSDN .

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

s'étend à :

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

qui s'étend ensuite à :

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

En anglais, cela signifie "Si ce qui est à gauche n'est pas nul, utilisez-le, sinon utilisez ce qui est à droite".

Notez que vous pouvez utiliser n'importe quel nombre de ces éléments dans l'ordre. L'instruction suivante attribue la première valeur non nulle à la variable Answer# à Answer :

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

22 votes

Il est potentiellement dangereux de les enchaîner.

92 votes

@CodeBlend, ce n'est pas dangereux. Si tu développais, tu aurais juste une série d'instructions if/else imbriquées. La syntaxe est juste étrange parce que vous n'avez pas l'habitude de la voir.

1 votes

@jm2 Tant que vous vérifiez ce que vous faites, par exemple si vous voulez avoir des ifs séparés et non imbriqués, ce ne serait pas approprié. (Lire ceci m'a vraiment montré un exemple décent (ish) de la façon dont il peut être utilisé)[ rlacovara.blogspot.com/2009/07/

327voto

Jon Skeet Points 692016

Ce n'est pas parce que personne d'autre n'a encore prononcé les mots magiques : c'est la opérateur de coalescence nul . Il est défini dans la section 7.12 de la Spécification du langage C# 3.0 .

C'est très pratique, notamment en raison de son associativité. Une expression de la forme :

a ?? b ?? c ?? d

donnera le résultat de l'expression 'a' si elle n'est pas nulle, sinon essayez 'b', sinon essayez 'c', sinon essayez 'd'. Il y a un court-circuit en tout point.

De même, si le type de 'd' est non nul, le type de l'expression entière est également non nul.

3 votes

J'aime comment vous avez simplifié sa signification à "opérateur de coalescence nul". C'est tout ce dont j'avais besoin.

2 votes

Tangentiel mais lié : C'est maintenant dans Swift, mais c'est très différent : "Nil Coalescing Operator". developer.apple.com/library/ios/documentation/Swift/Conceptual/

79voto

Iain Holder Points 7930

C'est l'opérateur de coalescence des nuls.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

Oui, presque impossible à rechercher si on ne sait pas comment ça s'appelle ! :-)

EDIT : Et voici une fonctionnalité intéressante d'une autre question. Vous pouvez les enchaîner.

http://stackoverflow.com/questions/9033/hidden-features-of-c#15765

38 votes

Au moins maintenant, il est facile de le rechercher, même si vous ne connaissez pas le nom, j'ai juste googlé "double point d'interrogation c#"

37voto

Edward Tanguay Points 43219

Merci à tous, voici l'explication la plus succincte que j'ai trouvée sur le site MSDN :

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

4 votes

Cela laisse entrevoir un aspect important de l'opérateur ? ? : il a été introduit pour aider à travailler avec des types nuls. Dans votre exemple, "x" est de type "int ? (Nullable<int>).

9 votes

@vitule non, si le second opérande de l'opérateur de coalescence nul est non nul, alors le résultat est non nul (et -1 est juste un simple int qui est non nul).

24voto

RedFilter Points 84190

?? est là pour fournir une valeur pour un type nullable lorsque la valeur est nulle. Ainsi, si formsAuth est null, il renverra new FormsAuthenticationWrapper().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X