что означает |= (один канал равен) и &=(один амперсанд равен)


в строках ниже:

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

что значит |= (одна труба равна) и &= (один знак равенства) означает в C#
Я хочу удалить системный атрибут с сохранением других...

3 82

3 ответа:

они составное задание операторы, переводящие (очень слабо)

x |= y;

на

x = x | y;

и то же самое для &. В нескольких случаях есть немного больше деталей относительно неявного приведения, и целевая переменная оценивается только один раз, но это в основном суть.

С точки зрения не-составные операторы, & является побитовым "и" и | - это побитовое "Или".

EDIT: в этом случае вы хотите Folder.Attributes &= ~FileAttributes.System. Чтобы понять, почему:

  • ~FileAttributes.System означает "все атрибуты за исключениемSystem" (~ побитово-нет)
  • & означает "результатом являются все атрибуты, которые встречаются с обеих сторон операнда"

так это в основном действует как маска - только сохранить те атрибуты, которые появляются в ("все, кроме системы"). В генерал:

  • |= только добавить биты до цели
  • &= только удалить биты от цели

a |= b эквивалентно a = a | b кроме этого a вычисляется только один раз
a &= b эквивалентно a = a & b кроме этого a вычисляется только один раз

чтобы удалить системный бит без изменения других битов, используйте

Folder.Attributes &= ~FileAttributes.System;

~ - это побитовое отрицание. Таким образом, вы установите все биты в 1 кроме системного бита. and - ing с маской установит систему в 0 и оставит все остальные биты неповрежденными, потому что 0 & x = 0 и 1 & x = x любой x

Я хочу удалить системный атрибут с сохранением других..

вы можете сделать это так:

Folder.Attributes ^= FileAttributes.System;