2013-06-28 5 views
2

В исследовании причину ошибки, я наткнулся на эту строку кода:Что такое оператор «| =» в C#?

Status |= (int)states.Reading; 

Что такое «| =» оператор в C#?

"Статус" определяются таким образом:

public static int Status 

... с аксессором и мутатором (или "добытчиком" и "сеттер"), в то время как "государство" определяются следующим образом:

[Flags] 
public enum states 
+2

Но вся строка не закомментирована ...? – JustinStolle

+0

О да, вы правы - это очевидно здесь, но не в редакторе (из-за подсветки синтаксиса цвета (отсутствие этого в моей установке VS2003)). Итак, я отредактирую вопрос соответствующим образом. –

+0

Закрыть, но нет обмана: http://stackoverflow.com/questions/5705262/what-does-pipe-mean-in-c –

ответ

9

это «побитовое логическое ИЛИ» оператор, как определено here.

x |= y эквивалентно x = x | y

Кроме того, если вы хотите узнать больше о "|" сам оператор, вы можете это сделать here.

2

При использовании счетчиков, если вы указали атрибут [Flags] поверх члена «enum», это позволяет пользователю выбирать более одного счетчика за один раз. Что я имею в виду следующее: -

если это ваш переписчик: -

[Serializable, DataContract(Namespace = "Company.Domain.LOB.Handler")] 
[Flags] 
public enum BankItemStatus 
{ 
    [EnumMember] 
    UnBatched, 
    [EnumMember] 
    Batched, 
    [EnumMember] 
    Sent, 
    [EnumMember] 
    ReplyReceived, 
    [EnumMember] 
    Closed 
} 

Теперь, если вы используете Enum как это: -

BankItemStatus bankItemStatus = BankItemStatus.UnBatched; 
BankItemStatus bankItemStatus = BankItemStatus.Sent; 

Окончательное значение сохраняется bankItemStatus бы be BankItemStatus.Sent. Вы можете проверить это следующим образом: -

if(bankItemStatus.UnBatched==BankItemStatus.UnBatched) //FALSE 
if(bankItemStatus.Sent==BankItemStatus.Sent) //TRUE 

Теперь, если вы делаете это так: -

BankItemStatus bankItemStatus = BankItemStatus.UnBatched; 
bankItemStatus |= bankItemStatus.Sent 

Вы увидите, что bankItemStatus теперь как члены перечислений. Вы можете проверить это следующим образом: -

if(bankItemStatus.UnBatched==BankItemStatus.UnBatched) //TRUE 
if(bankItemStatus.Sent==BankItemStatus.Sent) //TRUE 

Надежда, что помогает в понимании использования | = оператор в C# (в контексте счетчиков).

+0

Отличный ответ, спасибо; Я как-то изменил ответ, который я обозначил как правильный для другого кота, который предоставил более подробный ответ, и оригинал, присужденный автоответчику, безутешно оплакивал, поэтому я оставлю принятый ответ «как есть», хотя это отлично. BTW, «BatchItemStatus» должен быть «BankItemStatus» в определении перечисления. –