O que significa | = (único tubo igual) e & = (único e comercial igual)

116

Nas linhas abaixo:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

O que significa |=(único tubo igual) e &=(único e comercial igual) em C #?
Desejo remover o atributo do sistema mantendo os outros ...

Luz cinza
fonte

Respostas:

150

Eles são operadores de atribuição composta , traduzindo (muito vagamente)

x |= y;

para dentro

x = x | y;

e o mesmo para &. Há um pouco mais de detalhes em alguns casos em relação a uma conversão implícita, e a variável de destino é avaliada apenas uma vez, mas essa é basicamente a essência.

Em termos de operadores não compostos, &é um "E" bit a bit e |um "OU" bit a bit .

EDIT: Neste caso, você deseja Folder.Attributes &= ~FileAttributes.System. Para entender por quê:

  • ~FileAttributes.Systemsignifica "todos os atributos exceto System " ( ~é um bit a bit NOT)
  • & significa "o resultado são todos os atributos que ocorrem em ambos os lados do operando"

Portanto, ele está basicamente agindo como uma máscara - retém apenas os atributos que aparecem em ("tudo exceto Sistema"). Em geral:

  • |=adicionará bits ao alvo
  • &=removerá bits do alvo
Jon Skeet
fonte
2
x = x | (y);é uma maneira melhor de descrevê-lo porque x |= y + z;não é o mesmo quex = x | y + z;
IronMensan
obrigado pelas respostas / mas para o meu propósito (remover o atributo do sistema) qual devo usar (| = ou & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= bé equivalente a a = a | bexceto que aé avaliado apenas uma vez
a &= bé equivalente a a = a & bexceto que aé avaliado apenas uma vez

Para remover o bit do sistema sem alterar os outros bits, use

Folder.Attributes &= ~FileAttributes.System;

~é negação bit a bit. Assim, você definirá todos os bits como 1, exceto o bit do sistema. and-ing-lo com a máscara irá definir o sistema para 0 e deixar todos os outros bits intactos porque 0 & x = 0e 1 & x = xpara qualquerx

Armen Tsirunyan
fonte
1
O que significa que asó é avaliado uma vez? Por que seria avaliado mais vezes do que isso?
silkfire
@silkfire Isso é chamado de avaliação de curto-circuito, consulte en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Então, basicamente, a |= brealmente significa a = a || b?
silkfire
@silkfire Sim, mas não troque um cano e dois canos.
Polluks de
3

Quero remover o atributo do sistema mantendo os outros ..

Você pode fazer isso assim:

Folder.Attributes ^= FileAttributes.System;
Chris S
fonte
1
Eu acho que você deseja usar um XOR em vez de um AND para isso.
GameZelda
um pouco confuso / ~ é necessário ou não
SilverLight
@LostLord Os dois métodos são análogos, tanto quanto eu sei
Chris S
@ChrisS ^= bitdefinirá o bit se ainda não estiver definido, &= ~bitnão o definirá.
Crônica de
você definitivamente não quer usar um xor. Isso o colocaria de volta se tivesse sumido.
John Lord