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


Ran à travers cette ligne de code:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

Que signifient les deux points d'interrogation, s'agit-il d'une sorte d'opérateur ternaire? Il est difficile de regarder dans Google.


1320
2018-01-15 14:03


origine


Réponses:


C'est l'opérateur de coalescence nulle, et tout à fait comme l'opérateur ternaire (immédiat-si). Voir également ?? Opérateur - MSDN.

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

se développe pour:

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

qui s'étend à:

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

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

Notez que vous pouvez utiliser n'importe lequel de ces nombres en séquence. La déclaration suivante affectera le premier non-null Answer# à Answer (si toutes les réponses sont nulles alors le Answer est nul):

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

Aussi, il vaut la peine de mentionner que si l'expansion ci-dessus est conceptuellement équivalente, le résultat de chaque expression n'est évalué qu'une seule fois. Ceci est important si par exemple une expression est un appel de méthode avec des effets secondaires. (Merci à @Joey pour l'avoir signalé.)


1801
2018-01-15 14:04



Juste parce que personne d'autre n'a encore dit les mots magiques: c'est le opérateur de coalescence null. Il est défini à la section 7.12 du Spécification de langage C # 3.0.

C'est très pratique, en particulier à cause de la façon dont cela fonctionne quand il est utilisé plusieurs fois dans une expression. Une expression de la forme:

a ?? b ?? c ?? d

donnera le résultat de l'expression a si c'est non nul, sinon essayez b, sinon essayez c, sinon essayez d. Il court-circuite à chaque point.

De plus, si le type de d est non-nullable, le type de l'expression entière est non-nullable aussi.


232
2018-01-15 14:07



C'est l'opérateur de coalescence nulle.

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

Oui, presque impossible à chercher à moins de savoir comment ça s'appelle! :-)

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

Caractéristiques cachées de C #?


64
2018-01-15 14:05



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;

21
2018-01-15 14:09



?? est là pour fournir une valeur pour un type nullable lorsque la valeur est null. Donc, si formsAuth est nul, il retournera un nouveau FormsAuthenticationWrapper ().


16
2018-01-15 14:05



enter image description here

Les deux points d'interrogation (??) indiquent qu'il s'agit d'un opérateur Coalescing.

L'opérateur de coalescence renvoie la première valeur NON-NULL d'une chaîne. Tu peux voir cette vidéo youtube ce qui démontre le tout pratiquement.

Mais laissez-moi ajouter plus à ce que la vidéo dit.

Si vous voyez le sens anglais de la coalescence, il est dit "consolider ensemble". Par exemple ci-dessous est un simple code de coalescence qui enchaîne quatre chaînes.

Donc si str1 est null ça va essayer str2, si str2 est null ça va essayer str3 et ainsi de suite jusqu'à ce qu'il trouve une chaîne avec une valeur non nulle.

string final = str1 ?? str2 ?? str3 ?? str4;

En termes simples, l'opérateur de coalescence renvoie la première valeur NON-NULL d'une chaîne.


13
2017-12-16 10:30



C'est une main courte pour l'opérateur ternaire.

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

Ou pour ceux qui ne font pas ternaire:

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

9
2018-01-15 14:05



Si vous connaissez Ruby, son ||= semble s'apparenter à C # 's ?? pour moi. Voici un peu de Ruby:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

Et en C #:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

9
2018-06-30 17:16



Pour votre amusement seulement (sachant que vous êtes tous les gars C # ;-).

Je pense que cela a commencé à Smalltalk, où il existe depuis de nombreuses années. Il est défini ici comme:

dans l'objet:

? anArgument
    ^ self

dans UndefinedObject (la classe de nil):

? anArgument
    ^ anArgument

Il existe à la fois des versions d'évaluation (?) Et de non-évaluation (??).
Il est souvent trouvé dans les méthodes getter pour les variables privées (instance) paresseuses initialisées, qui sont laissées nuls jusqu'à ce que vraiment nécessaire.


8
2018-01-15 14:31



Rien de dangereux à ce sujet. En fait, c'est beau. Vous pouvez ajouter une valeur par défaut si cela est souhaitable, par exemple:

CODE

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

8
2018-03-21 21:13



opérateur de coalescence

c'est équivalent à

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

7
2018-01-15 14:05