标志和<<枚举上的操作?C#

Joe*_*Min 3 c# enums bit-manipulation

好的,所以我是C#的新手,对于我的生活,我无法理解下面的代码(来自遗留项目)应该做什么:

[Flags]
public enum EAccountStatus
{
    None = 0,
    FreeServiceApproved = 1 << 0,
    GovernmentAccount = 1 << 1,
    PrivateOrganisationAccount = 1 << 2,
    All = 8
}
Run Code Online (Sandbox Code Playgroud)

<<操作员在枚举中到底做了什么?我们为什么需要这个?

Avi*_*ner 7

在幕后,枚举实际上是一个int.
<<按位左移运算符
编写此代码的等效方法是:

[Flags]
public enum EAccountStatus
{
    None = 0,
    FreeServiceApproved = 1,
    GovernmentAccount = 2,
    PrivateOrganisationAccount = 4,
    All = 8
}
Run Code Online (Sandbox Code Playgroud)

请注意,此枚举具有Flag属性

如msdn中所述:

仅当要对数值执行按位运算(AND,OR,EXCLUSIVE OR)时,才使用FlagsAttribute自定义属性进行枚举.

这样,如果您想要设置多个选项,您可以使用:

var combined =  EAccountStatus.FreeServiceApproved  | EAccountStatus.GovernmentAccount 
Run Code Online (Sandbox Code Playgroud)

这相当于:

  00000001  // =1 - FreeServiceApproved 
| 00000010  // =2 - GovernmentAccount 
 ---------
  00000011  //= 3 - FreeServiceApproved  and  GovernmentAccount 
Run Code Online (Sandbox Code Playgroud)

这个SO线程有一个很好的解释flags attribute

  • FLAGS 上不应该有 ALL(“所有标志”)选项。这里所有标志的组合是 7,而不是 8,这会产生 2 个表示 ALL 的值。解决方案是对所有选项进行二进制或操作,但是当添加另一个枚举并且开发人员不更新所有枚举时,几乎肯定会出现错误。另一个问题是,如果在存储数据时使用值 8,则标志枚举 EAccountStatus 被有效密封,这意味着在不修改存储数据的情况下无法添加更多选项。除了报告之外,您很少需要检查所有内容。 (2认同)