[C#] ¿Cuál es la tilde (~) en la definición de enum?


Answers

Yo pensaría que:

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

Sería un poco más claro.

Question

Siempre me sorprende que incluso después de usar C # durante todo este tiempo, aún logré encontrar cosas que no sabía ...

Intenté buscar en Internet esto, 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 la 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 traté de compilarlo, y funcionó ... pero todavía no sé lo que significa / hace. ¿¿Alguna ayuda??




Es mejor que el

All = Cash | Check | CreditCard

solución, porque si agrega otro método más tarde, diga:

PayPal = 8 ,

ya habrás terminado con la tilde-Todo, pero tendrás que cambiar la línea general por la otra. Por lo tanto, es menos propenso a errores más adelante.

Saludos




Solo quiero agregar, si usa [Flags] enum, entonces puede ser más conveniente usar un operador de desplazamiento a la izquierda bit a bit, como este:

[Flags]
enum SampleEnum
{
    None   = 0,      // 0
    First  = 1 << 0, // 1b    = 1d
    Second = 1 << 1, // 10b   = 2d
    Third  = 1 << 2, // 100b  = 4d
    Fourth = 1 << 3, // 1000b = 8d
    All    = ~0      // 11111111b
}



La alternativa que personalmente uso, que hace lo mismo que la respuesta de @Sean Bright pero me parece mejor, es esta:

[Flags]
public enum PurchaseMethod
{
    None = 0,
    Cash = 1,
    Check = 2,
    CreditCard = 4,
    PayPal = 8,
    BitCoin = 16,
    All = Cash + Check + CreditCard + PayPal + BitCoin
}

Observe cómo la naturaleza binaria de esos números, que son todos los poderes de dos, hace verdadera la siguiente aserción: (a + b + c) == (a | b | c) . Y en mi humilde opinión, + ve mejor.




Para otros que encontraron esta pregunta esclarecedora, tengo un rápido ~ ejemplo para compartir. El siguiente fragmento de la implementación de un método de pintura, como se detalla en esta documentación de Mono , usa ~ con gran efecto:

PaintCells (clipBounds, 
    DataGridViewPaintParts.All & ~DataGridViewPaintParts.SelectionBackground);

Sin el operador ~ , el código probablemente se vería así:

PaintCells (clipBounds, DataGridViewPaintParts.Background 
    | DataGridViewPaintParts.Border
    | DataGridViewPaintParts.ContentBackground
    | DataGridViewPaintParts.ContentForeground
    | DataGridViewPaintParts.ErrorIcon
    | DataGridViewPaintParts.Focus);

... porque la enumeración se ve así:

public enum DataGridViewPaintParts
{
    None = 0,
    Background = 1,
    Border = 2,
    ContentBackground = 4,
    ContentForeground = 8,
    ErrorIcon = 16,
    Focus = 32,
    SelectionBackground = 64,
    All = 127 // which is equal to Background | Border | ... | Focus
}

¿Nota la similitud de esta enum 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 normal de código.