¿Qué significa | = (un solo tubo igual) y & = (simple y comercial igual)?

116

En las siguientes líneas:

//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;

¿Qué significa |=(single pipe igual) y &=(single ampersand igual) en C #
? Quiero eliminar el atributo del sistema manteniendo los demás ...

SilverLight
fuente

Respuestas:

149

Son operadores de asignación compuesta , traduciendo (muy libremente)

x |= y;

dentro

x = x | y;

y lo mismo para &. Hay un poco más de detalle en algunos casos con respecto a un elenco implícito, y la variable de destino solo se evalúa una vez, pero eso es básicamente lo esencial.

En términos de los operadores no compuestos, &es un "Y" |bit a bit y es un "OR" bit a bit .

EDITAR: En este caso quieres Folder.Attributes &= ~FileAttributes.System. Para entender por qué:

  • ~FileAttributes.Systemsignifica "todos los atributos excepto System " ( ~es un bit a bit)
  • & significa "el resultado son todos los atributos que ocurren en ambos lados del operando"

Así que básicamente actúa como una máscara: solo retiene los atributos que aparecen en ("todo excepto el Sistema"). En general:

  • |=solo agregará bits al objetivo
  • &=solo eliminará bits del objetivo
Jon Skeet
fuente
2
x = x | (y);es una mejor manera de describirlo porque x |= y + z;no es lo mismo quex = x | y + z;
IronMensan
gracias por las respuestas / pero para mi propósito (eliminar el atributo del sistema), ¿cuál debo usar (| = o & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= bes equivalente a a = a | bexcepto que ase evalúa solo una vez
a &= bes equivalente a a = a & bexcepto que ase evalúa solo una vez

Para eliminar el bit del sistema sin cambiar otros bits, utilice

Folder.Attributes &= ~FileAttributes.System;

~es la negación bit a bit. Por lo tanto, establecerá todos los bits en 1 excepto el bit del sistema. and-Si con la máscara se establecerá el Sistema en 0 y dejará todos los demás bits intactos porque 0 & x = 0y 1 & x = xpara cualquierx

Armen Tsirunyan
fuente
1
¿Qué significa que asolo se evalúe una vez? ¿Por qué se evaluaría más veces que eso?
Silkfire
@silkfire Esto se llama evaluación de cortocircuito, consulte en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks ¿Entonces básicamente a |= bsignifica a = a || b?
Silkfire
@silkfire Sí, pero no intercambie un tubo y dos tubos.
Contamina
3

Quiero eliminar el atributo del sistema manteniendo los demás.

Puedes hacer esto así:

Folder.Attributes ^= FileAttributes.System;
Chris S
fuente
1
Creo que desea usar un XOR en lugar de un AND para esto.
GameZelda
un poco confundido / ~ es necesario o no
SilverLight
@LostLord Los dos métodos son análogos hasta donde yo sé
Chris S
@ChrisS ^= bitestablecerá el bit si aún no estaba establecido, &= ~bitno lo establece.
Crónica
definitivamente no quieres usar un xor. Eso lo devolvería si se hubiera ido.
John Lord