2011-08-04 16 views
75

się poniżej linii:co robi | = (pojedyncza rura równe) i & = (single ampersand równe) oznaczać

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

Co |= (pojedyncza rura równe) i &= (single ampersand równe) oznacza w języku C#
Chcę usunąć atrybut systemu z zachowaniem innych ...

+0

próbowałem zrobić wersję mojego własnego manekina (I wpaść w tej grupie) z tego co http://www.shrinkrays.net/articles/csharp-bit-manipulation- by-example.aspx. ~ jest NOT lub odwrotnością FileAttributes.System –

+0

@Chris S: dzięki za link/nice – MoonLight

Odpowiedz

103

compound assignment operatorów, tłumacząc (bardzo luźno)

x |= y; 

do

x = x | y; 

i taka sama dla &. W kilku przypadkach jest nieco więcej szczegółów dotyczących niejawnego rzutowania, a zmienna docelowa jest oceniana tylko raz, ale jest to zasadniczo jej istotą.

Pod względem operatorów nieprzyłączających, & is a bitwise "AND" i | is a bitwise "OR".

EDYCJA: W tym przypadku potrzebujesz Folder.Attributes &= ~FileAttributes.System. Aby zrozumieć, dlaczego:

  • ~FileAttributes.System oznacza „wszystkie atrybuty wyjątkiemSystem” (~ jest bitwise-NOT)
  • & oznacza „wynik jest wszystkie atrybuty, które występują po obu stronach argumentu”

W zasadzie działa jak maska ​​- tylko zachowuje te atrybuty, które pojawiają się w ("wszystko oprócz systemu"). Ogólnie:

  • |= będzie tylko kiedykolwiek dodać bity do celu
  • &= będzie tylko kiedykolwiek usunąć bity od celu
+1

'x = x | (y); 'jest lepszym sposobem opisu, ponieważ' x | = y + z; 'nie jest tym samym co' x = x | y + z; ' – IronMensan

+0

dzięki za odpowiedzi/ale dla mojego celu (usunięcie atrybutu systemowego) który powinienem użyć (| = lub & =)? – MoonLight

+1

@LostLord: 'Folder.Attributes & = ~ FileAttributes.System;' –

27

a |= b jest równoważna a = a | b oprócz tego a oceniana jest tylko raz
a &= b jest równoważna a = a & b oprócz tego a oceniana jest tylko raz

W celu usunięcia bitowy system bez zmieniania innych bitów, użyj

Folder.Attributes &= ~FileAttributes.System; 

~ jest bitową negacją. W ten sposób ustawisz wszystkie bity na 1, oprócz bitu System.and -ing go z maską będzie ustawiony na 0 systemu i zostawić wszystkie inne kawałki nienaruszone ponieważ 0 & x = 0 i 1 & x = x jakiegokolwiek x

3

Chcę usunąć atrybut systemu z zachowaniem innych ..

Ty można to zrobić tak:

Folder.Attributes ^= FileAttributes.System; 
+1

Myślę, że chcesz użyć XOR zamiast AND w tym celu. – GameZelda

+0

trochę mylić/~ jest konieczne lub nie – MoonLight

+0

@ LostLord: To na pewno jest! Zobacz moją odpowiedź na wyjaśnienie –