c# - 枚举作为标志使用、设置和移动

标签 c# .net enums flags

我有两个标志:

[Flags]
enum Flags
{
  A = 1,
  B = 2
};

我是这样设置的:

Mode = Flags.A | Flags.B; // default value
for(int i = 0; i < args.Length; i++) {
switch(args[i])
{
  case "--a":
  {
    if ((Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B) 
     // both, default assume
    {
      Mode = Flags.A; // only A
    }
    else
    {
      Mode |= Flags.A; // append A
    }
    break;
  }
  case "--b":
  {
    if ((Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Mode.B)
    {
      Mode = Flags.B;
    }
    else
    {
      Mode |= Flags.B;
    }
    break;
  }
} }

以后像这样使用它们:

if((Mode & Flags.A) == Flags.A)
{
 //
}
if((Mode & Flags.B) == Flags.B)
{
 //
}

主要保留:两个标志都可以设置。或者只执行一个,在这种情况下只执行一部分代码。

我的代码好吗?设置标志的最佳方式是什么?

更新: 这样是不是先不那么丑了,你觉得怎么样?

Mode = 0; // default value now is empty
for(int i = 0; i < args.Length; i++) {
switch(args[i])
{
  case "--a":
  {
    Mode |= Flags.A;
    break;
  }
  case "--b":
  {
    Mode |= Flags.B;
    break;
  }
} }
if(Mode == 0)
{
  Mode = Flags.A | Flags.B; // if no parameters are given, setup both flags
}

最佳答案

这是我设置标志的方式:

Mode = 0;
for(int i = 0; i < args.Length; i++) {
    switch(args[i]) {
    case "--a":
        Mode |= Flags.A;
        break;
    case "--b":
        Mode |= Flags.B;
        break;
    }
}

如果默认情况下两个标志都打开,我认为将命令行参数更改为类似 --not-a 的内容更有意义和 --not-b .这既反射(reflect)了默认设置,又让你摆脱了 (Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B ,恕我直言,这相当丑陋。

然后你可以像这样设置你的标志:

Mode = Flags.A | Flags.B;
for(int i = 0; i < args.Length; i++) {
    switch(args[i]) {
    case "--not-a":
        Mode &= ~Flags.A;
        break;
    case "--not-b":
        Mode &= ~Flags.B;
        break;
    }
}

最后,如果你有很多标志(而不是两个),像这样设置你的枚举可能会更容易:

[Flags]
enum Flags
{
    A = 1,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    E = 1 << 4,
    F = 1 << 5
};

关于c# - 枚举作为标志使用、设置和移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581555/

相关文章:

c# - 如何将 SUM 聚合函数添加到 Entity Framework 查询中

c# - 如果在服务器端设置了控件的属性,则阻止或绕过事件

c# - 编写自己的异步方法

c# - 了解 C# 中的异步和等待

c# - 富文本框中的图标?

java - 如何在java中的单例(Enum风格)上调用私有(private)方法?

c# - 从内存中加载数据库文件

javascript - 无法将数组条目作为数据参数传递 - 内部服务器错误

java - 调用枚举变量时格式化它们

c++ - 为每个枚举器添加代码