Je suis toujours surpris que même après avoir utilisé C # pendant tout ce temps maintenant, j'arrive toujours à trouver des choses que je ne savais pas ...
J'ai essayé de chercher sur Internet pour cela, mais utiliser le "~" dans une recherche ne fonctionne pas très bien pour moi et je n'ai rien trouvé sur MSDN non plus (pour ne pas dire qu'il n'y est pas)
J'ai vu cet extrait de code récemment, que signifie 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 alors j'ai essayé de le compiler, et cela a fonctionné ... mais je ne sais toujours pas ce que cela signifie / fait. De l'aide??
c#
enums
language-features
enumeration
Hugoware
la source
la source
Réponses:
~ est l'opérateur de complément à un unaire - il retourne les bits de son opérande.
en arithmétique complémentaire à deux,
~x == -x-1
l'opérateur ~ peut être trouvé dans à peu près n'importe quel langage qui a emprunté la syntaxe de C, y compris Objective-C / C ++ / C # / Java / Javascript.
la source
Je pense que:
Ce serait un peu plus clair.
la source
En raison de deux complément en C #,
~0 == -1
le nombre où tous les bits sont 1 dans la représentation binaire.la source
C'est mieux que le
solution, car si vous ajoutez une autre méthode plus tard, dites:
vous en aurez déjà fini avec le tilde-All, mais vous devrez changer le all-line avec l'autre. Donc, c'est moins sujet aux erreurs plus tard.
Cordialement
la source
Juste une note latérale, lorsque vous utilisez
vous avez l'avantage supplémentaire qui
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 utilisateuret additionnez leurs valeurs, et l'utilisateur les sélectionne toutes, vous verriez
All
dans l'énumération résultante.la source
myEnum.HasFlag()
place: DAll.HasFlag(Cash | Check | CreditCard)
utilisiez ~ 0 pour "Tous", vous pourriez faire quelque chose comme et cela évaulerait à vrai. Serait une solution de contournement car==
ne fonctionne pas toujours avec ~ 0.ToString
- pas de l'utilisation== All
.Pour ceux qui ont trouvé cette question éclairante, j'ai un
~
exemple rapide à partager. L'extrait suivant de l'implémentation d'une méthode de peinture, comme détaillé dans cette documentation Mono , utilise~
à bon escient:Sans l'
~
opérateur, le code ressemblerait probablement à ceci:... parce que l'énumération ressemble à ceci:
Remarquez la similitude de cette énumération avec la réponse de Sean Bright?
Je pense que le plus important à retenir pour moi est que
~
c'est le même opérateur dans une énumération que dans une ligne de code normale.la source
&
s ne devraient-ils pas être des|
s?C'est un opérateur de complément, voici un article auquel je me réfère souvent pour les opérateurs bit à bit
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
Aussi msdn l'utilise dans son article enums qui démontre qu'il utilise mieux
http://msdn.microsoft.com/en-us/library/cc138362.aspx
la source
L'alternative que j'utilise personnellement, qui fait la même chose que la réponse de @Sean Bright mais me semble meilleure, est celle-ci:
Remarquez comment la nature binaire de ces chiffres, qui sont tous les pouvoirs de deux, fait l'affirmation suivante vraie:
(a + b + c) == (a | b | c)
. Et à mon humble avis,+
semble mieux.la source
J'ai fait quelques expériences avec le ~ et je trouve qu'il pourrait avoir des pièges. Considérez cet extrait de code pour LINQPad qui montre que la valeur d'énumération All ne se comporte pas comme prévu lorsque toutes les valeurs sont regroupées.
la source
Je veux juste ajouter, si vous utilisez [Flags] enum, alors il peut être plus pratique d'utiliser l'opérateur de décalage gauche au niveau du bit, comme ceci:
la source