Que signifient | = (simple tuyau égal) et & = (simple esperluette égale)

116

Dans les lignes ci-dessous:

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

Que signifient |=(single pipe égal) et &=(single esperluette égal) en C #
je veux supprimer l'attribut système en gardant les autres ...

SilverLight
la source

Réponses:

150

Ce sont des opérateurs d' affectation composés , traduisant (très librement)

x |= y;

dans

x = x | y;

et la même chose pour &. Il y a un peu plus de détails dans quelques cas concernant un cast implicite, et la variable cible n'est évaluée qu'une seule fois, mais c'est essentiellement l'essentiel.

En termes d'opérateurs non composés, &est un "ET" |au niveau du bit et un "OU" au niveau du bit .

EDIT: Dans ce cas, vous voulez Folder.Attributes &= ~FileAttributes.System. Pour comprendre pourquoi:

  • ~FileAttributes.Systemsignifie "tous les attributs sauf System " ( ~est un PAS au niveau du bit)
  • & signifie "le résultat est tous les attributs qui se produisent des deux côtés de l'opérande"

Donc, il agit essentiellement comme un masque - ne conserver que les attributs qui apparaissent dans ("tout sauf le système"). En général:

  • |=n'ajoutera jamais que des bits à la cible
  • &=ne supprimera jamais que des bits de la cible
Jon Skeet
la source
2
x = x | (y);est une meilleure façon de le décrire car ce x |= y + z;n'est pas la même chose quex = x | y + z;
IronMensan
merci pour les réponses / mais pour mon objectif (suppression de l'attribut système) lequel dois-je utiliser (| = ou & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= béquivaut à a = a | bsauf que an'est évalué qu'une seule fois
a &= béquivaut à a = a & bsauf que an'est évalué qu'une seule fois

Afin de supprimer le bit système sans changer les autres bits, utilisez

Folder.Attributes &= ~FileAttributes.System;

~est une négation au niveau du bit. Vous mettrez ainsi tous les bits à 1 sauf le bit Système. and-l'utiliser avec le masque mettra System à 0 et laissera tous les autres bits intacts car 0 & x = 0et 1 & x = xpour toutx

Armen Tsirunyan
la source
1
Qu'est-ce que cela signifie qui an'est évalué qu'une seule fois? Pourquoi serait-il évalué plus de fois que cela?
Silkfire
@silkfire C'est ce qu'on appelle l'évaluation des courts-circuits, voir en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Donc, en fait, ça a |= bveut dire a = a || b?
silkfire
@silkfire Oui, mais n'échangez pas un tuyau et deux tuyaux.
Polluks
3

Je souhaite supprimer l'attribut système en conservant les autres.

Vous pouvez faire ceci comme ceci:

Folder.Attributes ^= FileAttributes.System;
Chris S
la source
1
Je pense que vous voulez utiliser un XOR au lieu d'un AND pour cela.
GameZelda
un peu confus / ~ est nécessaire ou pas
SilverLight
@LostLord Les deux méthodes sont analogues à ma connaissance
Chris S
@ChrisS ^= bitdéfinira le bit s'il n'était pas déjà défini, &= ~bitne le définira pas.
Chronique du
vous ne voulez certainement pas utiliser un xor. Cela le remettrait en place s'il avait disparu.
John Lord le