将枚举定义为2的标志/幂而不需要计算器的任何技巧?

Aar*_*ide 53 c# enums

我知道我可以成倍增长但是我不喜欢懒惰的编程.

有没有人设计过一些巫术来自动将枚举作为两个权力?

以下是我要使其具体化的例子:

[Flags]
private enum Targets : uint
{
    None = 0,
    Campaigns = 1,
    CampaignGroups = 2,
    Advertisers = 4,
    AdvertiserGroups = 8,
    AffiliateGroups = 16,
    Affiliates = 32,
    Creatives = 64,
    DetailedLeads = 128,
    DetailedSales = 256,
    ProgramLeads = 512,
    CreativeDeployments = 1024,
    CampaignCategories = 2048,
    Payouts = 4096,
    All = uint.MaxValue
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 107

将值写为移位位,让编译器进行数学运算:

[Flags]
private enum Targets : uint
{
    None                = 0,
    Campaigns           = 1,
    CampaignGroups      = 2 << 0,
    Advertisers         = 2 << 1,
    AdvertiserGroups    = 2 << 2,
    AffiliateGroups     = 2 << 3,
    Affiliates          = 2 << 4,
    Creatives           = 2 << 5,
    DetailedLeads       = 2 << 6,
    DetailedSales       = 2 << 7,
    ProgramLeads        = 2 << 8,
    CreativeDeployments = 2 << 9,
    CampaignCategories  = 2 << 10,
    Payouts             = 2 << 11,
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

詹姆斯的建议也很好.事实上,我更喜欢这种方式.你也可以这样写:

[Flags]
private enum Targets : uint
{
    None                = 0,
    Campaigns           = 1 << 0,
    CampaignGroups      = 1 << 1,
    Advertisers         = 1 << 2,
    AdvertiserGroups    = 1 << 3,
    AffiliateGroups     = 1 << 4,
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

  • 我做了类似的事情,除了2,我使用1 << 1,1-1 << 1 << 3等. (18认同)
  • 由于你的枚举的基础类型是'uint`,它实际上是`1u << 0`,`1u << 1`等.当你来到'LastFlag = 1u << 31`时,这可能很重要. (2认同)

dre*_*010 39

使用十六进制表示法比十进制表示法更简单(不需要计算器):

[Flags]
private enum Targets : uint
{
    None                = 0,
    Campaigns           = 0x01,
    CampaignGroups      = 0x02,
    Advertisers         = 0x04,
    AdvertiserGroups    = 0x08,
    AffiliateGroups     = 0x10,
    Affiliates          = 0x20,
    Creatives           = 0x40,
    DetailedLeads       = 0x80,
    DetailedSales       = 0x100,
    ProgramLeads        = 0x200,
    CreativeDeployments = 0x400,
    CampaignCategories  = 0x800,
    Payouts             = 0x1000,
    // and the pattern of doubling continues
    // 0x2000
    // 0x4000
    // 0x8000
    // 0x10000
}
Run Code Online (Sandbox Code Playgroud)

不像Cody和James的解决方案那么优雅,但不需要计算器.

  • 我已经看到该系统被广泛使用了很多次。因此,当您遇到使用它的代码时,很高兴知道它。我个人使用`1 &lt;&lt;` (2认同)

joa*_*del 8

快进五年,从 C# 7.0 开始,您可以使用新的数字二进制文字来简化枚举标志声明。

[Flags]
private enum Targets : uint
{
    None = 0,
    Campaigns =             0b0000_0000_0000_0001,
    CampaignGroups =        0b0000_0000_0000_0010,
    Advertisers =           0b0000_0000_0000_0100,
    AdvertiserGroups =      0b0000_0000_0000_1000,
    AffiliateGroups =       0b0000_0000_0001_0000,
    Affiliates =            0b0000_0000_0010_0000,
    Creatives =             0b0000_0000_0100_0000,
    DetailedLeads =         0b0000_0000_1000_0000,
    DetailedSales =         0b0000_0001_0000_0000,
    ProgramLeads =          0b0000_0010_0000_0000,
    CreativeDeployments =   0b0000_0100_0000_0000,
    CampaignCategories =    0b0000_1000_0000_0000,
    Payouts =               0b0001_0000_0000_0000,
    All = uint.MaxValue
}
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#numeric-literal-syntax-improvements