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 ...

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

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


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;

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.