Fico sempre surpreso que, mesmo depois de usar o C # por todo esse tempo, ainda consigo encontrar coisas que não sabia ...
Tentei pesquisar na Internet, mas usar o "~" em uma pesquisa não está funcionando tão bem para mim e também não encontrei nada no MSDN (para não dizer que não está lá)
Eu vi esse trecho de código recentemente, o que significa o til (~)?
/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{
All = ~0,
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4
}
Fiquei um pouco surpreso ao vê-lo, então tentei compilá-lo e funcionou ... mas ainda não sei o que isso significa / faz. Qualquer ajuda??
c#
enums
language-features
enumeration
Hugoware
fonte
fonte
Respostas:
~ é o operador complementar do unário - ele inverte os bits do seu operando.
na aritmética do complemento de dois,
~x == -x-1
o operador ~ pode ser encontrado em praticamente qualquer linguagem que emprestou sintaxe de C, incluindo Objective-C / C ++ / C # / Java / Javascript.
fonte
Eu pensaria que:
Seria um pouco mais claro.
fonte
Por causa de dois complementos em C #,
~0 == -1
o número em que todos os bits são 1 na representação binária.fonte
É melhor que o
solução, porque se você adicionar outro método posteriormente, diga:
você já estará pronto com o til-All, mas precisará alterar o all-line com o outro. Portanto, é menos propenso a erros mais tarde.
Saudações
fonte
Apenas uma nota lateral, quando você usa
você tem o benefício adicional que
Cash | Check | CreditCard
seria avaliadoAll
e não com outro valor (-1) que não é igual a todos e contém todos os valores. Por exemplo, se você usar três caixas de seleção na interface do usuárioe some seus valores, e o usuário seleciona todos eles, você verá
All
na enumeração resultante.fonte
myEnum.HasFlag()
: DAll.HasFlag(Cash | Check | CreditCard)
e isso seria eva verdade. Seria uma solução alternativa, pois==
nem sempre funciona com ~ 0.ToString
- não sobre o uso== All
.Para outros que acharam essa pergunta esclarecedora, tenho um
~
exemplo rápido para compartilhar. O seguinte trecho da implementação de um método de pintura, conforme detalhado nesta documentação Mono , usa~
com grande efeito:Sem o
~
operador, o código provavelmente seria algo como isto:... porque a enumeração se parece com isso:
Notou a semelhança desse enum com a resposta de Sean Bright?
Eu acho que a coisa mais importante para mim é que
~
é o mesmo operador em uma enumeração e em uma linha de código normal.fonte
&
ser|
s?É um operador de complemento. Aqui está um artigo ao qual frequentemente me refiro para operadores de bits
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
O msdn também o usa em seu artigo de enumerações, o que demonstra que ele usa melhor
http://msdn.microsoft.com/en-us/library/cc138362.aspx
fonte
A alternativa que eu pessoalmente uso, que faz a mesma coisa que a resposta de @Sean Bright, mas parece melhor para mim, é esta:
Observe como a natureza binária desses números, que são todas as potências de dois, faz a seguinte afirmação verdadeira:
(a + b + c) == (a | b | c)
. E IMHO,+
parece melhor.fonte
Fiz algumas experiências com o ~ e achei que poderia ter armadilhas. Considere esse trecho para LINQPad, que mostra que o valor All enum não se comporta conforme o esperado quando todos os valores são ored juntos.
fonte
Só quero adicionar, se você usar [Flags] enum, pode ser mais conveniente usar o operador de deslocamento à esquerda bit a bit, assim:
fonte