枚举作为国旗使用,设置和转移 [英] Enum as Flag using, setting and shifting

查看:105
本文介绍了枚举作为国旗使用,设置和转移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个标志:

  [国旗]
枚举标志
{
  A = 1,
  B = 2
};
 

我将它们设置是这样的:

 模式= Flags.A | Flags.B; // 默认值
的for(int i = 0; I< args.Length;我++){
开关(参数[我])
{
  案--a:
  {
    如果((模式和放大器; Flags.A)== Flags.A和放大器;及(模式和放大器; Flags.B)== Flags.B)
     //两者,默认假设
    {
      模式= Flags.A; //只有A
    }
    其他
    {
      模式| = Flags.A; //追加
    }
    打破;
  }
  案--b:
  {
    如果((模式和放大器; Flags.A)== Flags.A和放大器;及(模式和放大器; Flags.B)== Mode.B)
    {
      模式= Flags.B;
    }
    其他
    {
      模式| = Flags.B;
    }
    打破;
  }
}}
 

,并随后将是这样的:

  IF((模式和放大器; Flags.A)== Flags.A)
{
 //
}
如果((模式和放大器; Flags.B)== Flags.B)
{
 //
}
 

主要预订:两个标志可能被设置。或只是一个,在这种情况下执行的code只是其中的一部分。

是我的code好?什么是设置标志的最好方法是什么?

UPD : 这是不太难看那么首先,您怎么看?

 模式= 0; //默认值现在是空的
的for(int i = 0; I< args.Length;我++){
开关(参数[我])
{
  案--a:
  {
    模式| = Flags.A;
    打破;
  }
  案--b:
  {
    模式| = Flags.B;
    打破;
  }
}}
如果(模式== 0)
{
  模式= Flags.A | Flags.B; //如果没有给定参数,设置两个标志
}
 

解决方案

下面是我会怎么设置我的标志:

 模式= 0;
的for(int i = 0; I< args.Length;我++){
    开关(参数[我]){
    案--a:
        模式| = Flags.A;
        打破;
    案--b:
        模式| = Flags.B;
        打破;
    }
}
 

如果两个标志应该是在默认情况下,我觉得更有意义,改变命令行参数类似 - 不是-A - 不-B 。这既反映了默认设置,让您摆脱的(模式和放大器; Flags.A)== Flags.A和放大器;&安培; (模式和放大器; Flags.B)== Flags.B ,这是相当难看,恕我直言

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

 模式= Flags.A | Flags.B;
的for(int i = 0; I< args.Length;我++){
    开关(参数[我]){
    案 - 不是 - 一:
        模式和放大器; =〜Flags.A;
        打破;
    案--not-B:
        模式和放大器; =〜Flags.B;
        打破;
    }
}
 

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

  [国旗]
枚举标志
{
    A = 1,
    B = 1&其中;&其中; 1,
    C = 1<< 2,
    D = 1&其中;&其中; 3,
    E = 1<< 4,
    F = 1&其中;&其中;五
};
 

I have two flags:

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

I set them like this:

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;
  }
} }

and use them later like this:

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

Major reservation: Both flags may be set. Or just one, in this case only one part of code is executed.

Is my code good? What is the best way to setup flags?

Upd: Is this less ugly then first, how do you think?

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
}

解决方案

Here's how I would set my 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;
    }
}

If both flags should be on by default, I think it makes more sense to change the command line parameters to something like --not-a and --not-b. This would both reflect the default setting, and let you get rid of (Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B, which is rather ugly, IMHO.

Then you can set your flags like this:

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;
    }
}

Finally, if you have a lot of flags (instead of just two), it might be easier to set up your enum like this:

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

这篇关于枚举作为国旗使用,设置和转移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆