文章

位标志

在C#中,使用带有[Flags]特性的枚举来表示一组位标志是非常常见的需求。以下是如何独立使用每个标志、判断某个标志是否被设置以及设置某个标志的示例。

定义枚举

首先,定义一个带有[Flags]特性的枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Flags]
public enum GuidanceStatus : int
{
    None = 0,
    Lottery = 1,
    EnterAdventure = 1 << 1,
    SkillLevelUp = 1 << 2,
    AutoDecompose = 1 << 3,
    Equipment = 1 << 4,
    PetEquipment = 1 << 5,
    PetLevelUp = 1 << 6,
    AutoAttack = 1 << 7,
    All = int.MaxValue
}

设置标志

你可以通过使用位或运算符(|)来设置一个或多个标志:

1
2
3
4
5
6
7
GuidanceStatus status = GuidanceStatus.None;

// 设置 Lottery 标志
status |= GuidanceStatus.Lottery;

// 设置 EnterAdventure 标志
status |= GuidanceStatus.EnterAdventure;

判断标志

你可以通过使用位与运算符(&)来判断一个标志是否被设置:

1
2
3
4
5
6
7
8
9
if ((status & GuidanceStatus.Lottery) == GuidanceStatus.Lottery)
{
    Console.WriteLine("Lottery flag is set.");
}

if ((status & GuidanceStatus.EnterAdventure) == GuidanceStatus.EnterAdventure)
{
    Console.WriteLine("EnterAdventure flag is set.");
}

清除标志

你可以通过使用位与运算符和位取反运算符(& ~)来清除一个标志:

1
2
3
4
5
// 清除 Lottery 标志
status &= ~GuidanceStatus.Lottery;

// 清除 EnterAdventure 标志
status &= ~GuidanceStatus.EnterAdventure;

示例代码

以下是一个完整的示例代码,展示了如何设置、判断和清除标志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;

[Flags]
public enum GuidanceStatus : int
{
    None = 0,
    Lottery = 1,
    EnterAdventure = 1 << 1,
    SkillLevelUp = 1 << 2,
    AutoDecompose = 1 << 3,
    Equipment = 1 << 4,
    PetEquipment = 1 << 5,
    PetLevelUp = 1 << 6,
    AutoAttack = 1 << 7,
    All = int.MaxValue
}

public class Program
{
    public static void Main()
    {
        GuidanceStatus status = GuidanceStatus.None;

        // 设置标志
        status |= GuidanceStatus.Lottery;
        status |= GuidanceStatus.EnterAdventure;

        // 判断标志
        if ((status & GuidanceStatus.Lottery) == GuidanceStatus.Lottery)
        {
            Console.WriteLine("Lottery flag is set.");
        }

        if ((status & GuidanceStatus.EnterAdventure) == GuidanceStatus.EnterAdventure)
        {
            Console.WriteLine("EnterAdventure flag is set.");
        }

        // 清除标志
        status &= ~GuidanceStatus.Lottery;

        // 判断标志
        if ((status & GuidanceStatus.Lottery) == GuidanceStatus.Lottery)
        {
            Console.WriteLine("Lottery flag is still set.");
        }
        else
        {
            Console.WriteLine("Lottery flag is cleared.");
        }
    }
}

结果

运行上述代码,你会看到以下输出:

1
2
3
Lottery flag is set.
EnterAdventure flag is set.
Lottery flag is cleared.

这种方法可以方便地管理和操作多个标志位,非常适合用于需要表示和处理多种状态的场景。

本文由作者按照 CC BY 4.0 进行授权