Siempre me sorprende que incluso después de usar C # durante todo este tiempo, sigo encontrando cosas que no sabía ...
Intenté buscar esto en Internet, pero usar el "~" en una búsqueda no me funciona tan bien y tampoco encontré nada en MSDN (por no decir que no está allí)
Recientemente vi este fragmento de código, ¿qué significa 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
}
Me sorprendió un poco verlo, así que intenté compilarlo y funcionó ... pero todavía no sé lo que significa / hace. ¿¿Alguna ayuda??
c#
enums
language-features
enumeration
Hugoware
fuente
fuente
Respuestas:
~ es el operador complementario del unario: voltea los bits de su operando.
en la aritmética del complemento a dos,
~x == -x-1
El operador ~ se puede encontrar en casi cualquier lenguaje que tomó prestada la sintaxis de C, incluido Objective-C / C ++ / C # / Java / Javascript.
fuente
Yo pensaría que
Sería un poco más claro.
fuente
Debido a dos complementos en C #,
~0 == -1
el número donde todos los bits son 1 en la representación binaria.fuente
Es mejor que el
solución, porque si agrega otro método más tarde, diga:
ya habrá terminado con tilde-All, pero tendrá que cambiar la línea completa con la otra. Entonces es menos propenso a errores más tarde.
Saludos
fuente
Solo una nota al margen, cuando usas
tiene el beneficio adicional de
Cash | Check | CreditCard
evaluar aAll
y no a otro valor (-1) que no es igual a todos mientras contiene todos los valores. Por ejemplo, si usa tres casillas de verificación en la IUy sume sus valores, y el usuario los selecciona a todos, vería
All
en la enumeración resultante.fuente
myEnum.HasFlag()
en su lugar: DAll.HasFlag(Cash | Check | CreditCard)
usaste ~ 0 para "Todos", podrías hacer algo así y eso se traduciría en verdadero. Sería una solución ya==
que no siempre funciona con ~ 0.ToString
, no sobre el uso== All
.Para otros que encontraron esta pregunta esclarecedora, tengo un
~
ejemplo rápido para compartir. El siguiente fragmento de la implementación de un método de pintura, como se detalla en esta documentación de Mono , se utiliza~
con gran efecto:Sin el
~
operador, el código probablemente se vería así:... porque la enumeración se ve así:
¿Notan la similitud de esta enumeración con la respuesta de Sean Bright?
Creo que lo más importante para mí es que
~
es el mismo operador en una enumeración que en una línea de código normal.fuente
&
ser los|
s?Es un operador complementario. Aquí hay un artículo al que me refiero a menudo para operadores bit a bit
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
También msdn lo usa en su artículo de enumeraciones que demuestra que usa mejor
http://msdn.microsoft.com/en-us/library/cc138362.aspx
fuente
La alternativa que uso personalmente, que hace lo mismo que la respuesta de @Sean Bright pero me parece mejor, es esta:
Observe cómo la naturaleza binaria de esos números, que son todas las potencias de dos, hace la siguiente afirmación verdadera:
(a + b + c) == (a | b | c)
. Y en mi humilde opinión, se+
ve mejor.fuente
He experimentado un poco con el ~ y descubro que podría tener dificultades. Considere este fragmento para LINQPad que muestra que el valor All enum no se comporta como se esperaba cuando todos los valores se ofrecen juntos.
fuente
Solo quiero agregar, si usa la enumeración [Flags], entonces puede ser más conveniente usar el operador de desplazamiento a la izquierda bit a bit, como este:
fuente