3

バグの原因を調査しているときに、次のコード行に出くわしました。

Status |= (int)states.Reading;

C#の「|=」演算子とは何ですか?

「ステータス」は次のように定義されます。

public static int Status 

...アクセサーとミューテーター(または「ゲッター」と「セッター」)を使用し、「状態」は次のように定義されます。

[Flags]
public  enum states
4

2 に答える 2

10

ここで定義されているように、これは「ビットごとの論理 OR」演算子です。

x |= yと同等ですx = x | y

また、「|」について詳しく知りたい場合は、オペレーター自体は、ここで行うことができます。

于 2013-06-28T15:54:35.183 に答える
2

「enum」メンバーの上に [Flags] 属性を指定した場合に列挙子を使用すると、ユーザーは一度に複数の列挙子を選択できるようになります。私が意味するのはこれです:-

これが列挙子の場合:-

[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 によって保持される最終的な値は、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# での |= 演算子の使用を理解するのに役立つことを願っています (列挙子のコンテキストで)。

于 2013-06-28T16:04:43.510 に答える