Что означает | = (одинарная труба равна) и & = (одинарная амперсанда равна)
В следующих строках:
//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;
Что означает |=
(одинарная труба равна) и &=
(одинарный амперсанд равен) означает в С#
Я хочу удалить системный атрибут с сохранением других...
Ответы
Ответ 1
Они составное назначение операторов, перевод (очень свободно)
x |= y;
в
x = x | y;
и то же самое для &
. В нескольких случаях немного подробнее о неявном литье, а целевая переменная оценивается только один раз, но в основном суть этого.
В терминах не-составных операторов &
является поразрядным "AND" и |
- побитовое "ИЛИ" .
EDIT: в этом случае вы хотите Folder.Attributes &= ~FileAttributes.System
. Чтобы понять, почему:
-
~FileAttributes.System
означает "все атрибуты, кроме System
" (~
является побитовым-NOT)
-
&
означает, что "результатом являются все атрибуты, которые происходят с обеих сторон операнда"
Поэтому он в основном действует как маска - сохраняет только те атрибуты, которые появляются ( "все, кроме системы" ). В общем:
-
|=
будет только добавлять биты к цели
-
&=
будет удалять только биты из целевого объекта
Ответ 2
a |= b
эквивалентен a = a | b
, за исключением того, что a
оценивается только один раз
a &= b
эквивалентно a = a & b
, за исключением того, что a
оценивается только один раз
Чтобы удалить системный бит без изменения других битов, используйте
Folder.Attributes &= ~FileAttributes.System;
~
- побитовое отрицание. Таким образом, вы должны установить все биты в 1, кроме бита системы. and
- при помощи маски будет установлено значение "Система" равным 0, и все остальные биты останутся нетронутыми, поскольку 0 & x = 0
и 1 & x = x
для любого x
Ответ 3
Я хочу удалить системный атрибут, сохранив остальные.
Вы можете сделать это так:
Folder.Attributes ^= FileAttributes.System;