Was bedeutet | = (Einzelrohr gleich) und & = (einzelnes kaufmännisches Und gleich)?

115

In den folgenden Zeilen:

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

Was bedeutet |=(Single Pipe Equal) und &=(Single Ampersand Equal) in C # ?
Ich möchte Systemattribute entfernen, indem ich die anderen behalte ...

SilverLight
quelle

Antworten:

149

Sie sind zusammengesetzte Zuweisungsoperatoren , die übersetzen (sehr locker).

x |= y;

in

x = x | y;

und das gleiche für &. In einigen Fällen gibt es ein bisschen mehr Details bezüglich einer impliziten Umwandlung, und die Zielvariable wird nur einmal ausgewertet, aber das ist im Grunde das Wesentliche.

In Bezug auf die nicht zusammengesetzten Operatoren &ist ein bitweises "UND" und |ein bitweises "ODER" .

EDIT: In diesem Fall möchten Sie Folder.Attributes &= ~FileAttributes.System. Um zu verstehen warum:

  • ~FileAttributes.Systembedeutet "alle Attribute außer System " ( ~ist ein bitweises-NICHT)
  • & bedeutet "das Ergebnis sind alle Attribute, die auf beiden Seiten des Operanden auftreten"

Es fungiert also im Grunde genommen als Maske - behalten Sie nur die Attribute bei, die in ("alles außer System") erscheinen. Allgemein:

  • |=fügt dem Ziel immer nur Bits hinzu
  • &=wird immer nur entfernen Bits von dem Ziel
Jon Skeet
quelle
2
x = x | (y);ist eine bessere Art, es zu beschreiben, weil x |= y + z;es nicht dasselbe ist wiex = x | y + z;
IronMensan
danke für die Antworten / aber für meinen Zweck (Entfernen des Systemattributs) welches soll ich verwenden (| = oder & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= bist äquivalent zu a = a | baußer dass anur einmal ausgewertet
a &= bwird äquivalent zu a = a & baußer dass anur einmal ausgewertet wird

Verwenden Sie, um das Systembit zu entfernen, ohne andere Bits zu ändern

Folder.Attributes &= ~FileAttributes.System;

~ist bitweise Negation. Sie setzen also alle Bits mit Ausnahme des Systembits auf 1. andWenn Sie die Maske verwenden, wird das System auf 0 gesetzt und alle anderen Bits bleiben erhalten, da 0 & x = 0und 1 & x = xfür allex

Armen Tsirunyan
quelle
1
Was bedeutet es, dass anur einmal ausgewertet wird? Warum sollte es öfter ausgewertet werden?
Seidenfeuer
@silkfire Dies wird als Kurzschlussbewertung bezeichnet, siehe en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Also a |= beigentlich eigentlich a = a || b?
Seidenfeuer
@silkfire Ja, aber tauschen Sie nicht ein Rohr und zwei Rohre aus.
Polluks
3

Ich möchte Systemattribute entfernen, indem ich die anderen behalte.

Sie können dies folgendermaßen tun:

Folder.Attributes ^= FileAttributes.System;
Chris S.
quelle
1
Ich denke, Sie möchten dafür ein XOR anstelle eines UND verwenden.
GameZelda
ein bisschen verwirrt / ~ notwendig ist oder nicht
Silverlight
@LostLord Die beiden Methoden sind meines Wissens analog
Chris S
@ChrisS ^= bitsetzt das Bit, wenn es nicht bereits gesetzt wurde, &= ~bitsetzt es nicht.
Chronik
du willst definitiv kein xor verwenden. Das würde es zurückstellen, wenn es weg wäre.
John Lord