151 votes

Quel est le tilde (~) dans la définition enum?

Je suis toujours surpris de voir que même après l'utilisation de C# pour tout ce temps maintenant, j'ai encore réussi à trouver des choses que je ne connaissais pas...

J'ai essayé de chercher sur internet pour cela, mais en utilisant le "~" dans un moteur de recherche ne fonctionne pas pour moi si bien et je n'ai rien trouvé sur le site web MSDN (pour ne pas dire qu'il n'est pas là)

J'ai vu cet extrait de code récemment, ce qui ne le tilde (~)?

/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{   
    All = ~0,
    None =  0,
    Cash =  1,
    Check =  2,
    CreditCard =  4
}

J'ai été un peu surpris de le voir donc j'ai essayé de le compiler, et cela a fonctionné... mais je ne sais toujours pas ce que cela signifie/ne. Toute aide??

138voto

Jimmy Points 35501

~ est l'opérateur de complément de l'unaire - il retourne les bits de son opérande.

 ~0 = 0xFFFFFFFF = -1
 

en arithmétique de complément à deux, ~x == -x-1

L'opérateur ~ se trouve à peu près dans n'importe quel langage empruntant la syntaxe de C, y compris Objective-C / C ++ / C # / Java / Javascript.

59voto

Sean Bright Points 39480

Je pense que:

 [Flags]
public enum PurchaseMethod
{
    None = 0,
    Cash = 1,
    Check = 2,
    CreditCard = 4,
    All = Cash | Check | CreditCard
 }
 

Serait un peu plus clair.

23voto

 public enum PurchaseMethod
{   
    All = ~0, // all bits of All are 1. the ~ operator just inverts bits
    None =  0,
    Cash =  1,
    Check =  2,
    CreditCard =  4
}
 

En raison de deux compléments en C #, ~0 == -1 , le nombre où tous les bits sont 1 dans la représentation binaire.

17voto

blabla999 Points 2316

C'est mieux que le

 All = Cash | Check | CreditCard
 

solution, car si vous ajoutez une autre méthode plus tard, dites:

 PayPal = 8 ,
 

vous en aurez déjà fini avec le tilde-all, mais vous devrez changer la ligne entière avec l’autre. Donc, il est moins enclin à l'erreur plus tard.

Cordialement

11voto

configurator Points 15594

Juste une note de côté, lorsque vous utilisez

 All = Cash | Check | CreditCard
 

vous avez l'avantage supplémentaire que Cash | Check | CreditCard serait évalué à All et non à une autre valeur (-1) qui n'est pas égale à tout tout en contenant toutes les valeurs. Par exemple, si vous utilisez trois cases à cocher dans l'interface utilisateur

 [] Cash
[] Check
[] CreditCard
 

et somme leurs valeurs, et l'utilisateur les sélectionne tous, vous verriez All dans l'énumération résultante.

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