C#中的"|="运算符是什么?"

3

在研究错误的原因时,我发现了这行代码:

Status |= (int)states.Reading;

在 C# 中,"|=" 运算符是什么意思?

"Status" 的定义如下:

public static int Status 

...使用访问器和修改器(或“getter”和“setter”)进行定义,而“states”的定义方式如下:

[Flags]
public  enum states

2
但是整行代码并没有被注释掉...? - JustinStolle
是的,你说得对 - 这在这里很明显,但在编辑器中不是(因为颜色语法高亮(在我的VS2003设置中缺少))。所以,我会相应地编辑问题。 - B. Clay Shannon-B. Crow Raven
接近了,但不是重复:https://dev59.com/3G025IYBdhLWcg3w9qqQ - Peter K.
2个回答

10

这是“按位逻辑或”运算符,定义在这里

x |= y 等同于 x = x | y

另外,如果你想了解更多 "|" 运算符本身的内容,可以点击这里


2
在使用枚举器时,如果你在“enum”成员的顶部指定了[Flags]属性,则使用户能够一次选择多个枚举器。我的意思是这样的:如果这是你的枚举器:
[Serializable, DataContract(Namespace = "Company.Domain.LOB.Handler")]
[Flags]
public enum BankItemStatus
{
    [EnumMember]
    UnBatched,
    [EnumMember]
    Batched,
    [EnumMember]
    Sent,
    [EnumMember]
    ReplyReceived,
    [EnumMember]
    Closed
}

现在,如果您像这样使用枚举:-
BankItemStatus bankItemStatus = BankItemStatus.UnBatched;
BankItemStatus bankItemStatus = BankItemStatus.Sent;

bankItemStatus所保留的最终值将是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#中使用|=运算符(在枚举器的上下文中)。

非常好的答案,谢谢;我曾经把一个我标记为正确的答案改成了另一个提供了更详细答案的人,原来被授予奖励的回答者伤心欲绝,所以我会保留已接受的答案,尽管这个也很好。顺便说一下,在枚举定义中,“BatchItemStatus”应该改为“BankItemStatus”。 - B. Clay Shannon-B. Crow Raven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接