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

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

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


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;

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.