【问题标题】:C# problem with flags标志的 C# 问题
【发布时间】:2011-09-23 20:40:42
【问题描述】:

我有一个枚举(标志)

[Flags]
public enum DisplayMode
{
    None,
    Dim,
    Inverted,
    Parse,
    Italics,
    Bold
}

我想将两个标志分配给一个变量,如下所示:

var displayFlags = DisplayMode.Parse | DisplayMode.Inverted;

但是,当我在分配此变量后立即进行调试并将鼠标悬停在该变量上时,它显示 displayFlagsDisplayMode.Dim | DisplayMode.Inverted

我错过/不理解什么?

【问题讨论】:

  • 您知道您应该使用位掩码值而不是默认值。你没收到那份备忘录吗?
  • @ssg 你知道你应该使用建设性的建议而不是假设性的讽刺。你没有收到那份备忘录吗?
  • 说到假设,我指的是这里的答案一遍又一遍地重复同样的事情,而不是你。它来自我强烈推荐的电影办公空间。最后一点,讽刺可以很有建设性。
  • @ssg 啊,那我很抱歉。然而,关于你关于讽刺是建设性的评论……让人防守总是适得其反,从来没有建设性;许多持怀疑态度的爱好者在教他人如何进行批判性思维时需要学习的一课。

标签: c# .net asp.net variables enums


【解决方案1】:

您错过了为标志分配合理的值,例如:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

这样每个值在数字表示中都有一个单独的位。

如果你不相信你的双倍值的能力,你可以使用位移:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim =      1 << 0,
    Inverted = 1 << 1,
    Parse =    1 << 2,
    Italics =  1 << 3,
    Bold =     1 << 4
}

来自FlagsAttribute的文档:

FlagsAttribute 和枚举指南

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

  • 以 2 的幂定义枚举常数,即 1、2、4、8 等。这意味着组合枚举常量中的各个标志不会重叠。

...

【讨论】:

  • 感谢您的指导。
  • @rockinthesixstring:应该说“位移” - 基本上,将 1 向左移动多少位,以获得 2 的适当幂。
【解决方案2】:

默认情况下,枚举会为成员分配连续的值。所以你基本上得到了:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 3,
    Italics = 4,
    Bold = 5
}

这不适用于二进制/标志。所以你需要明确:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

【讨论】:

    【解决方案3】:

    您在声明时没有为您的枚举提供适当的值:

    [Flags]
    public enum DisplayMode
    {
        None = 0,
        Dim = 1,
        Inverted = 2,
        Parse = 4,
        Italics = 8,
        Bold = 16
    }
    

    【讨论】:

    • 为什么一切都需要翻倍?
    【解决方案4】:

    您需要明确指定标志的值。正如声明的那样,Parse 是 3,即 Dim |倒置。

    试试

    [Flags]
    public enum DisplayMode
    {
        None = 0,
        Dim = 1 << 0,
        Inverted = 1 << 1,
        Parse = 1 << 2,
        Italics = 1 << 3,
        Bold = 1 << 4
    }
    

    【讨论】:

      【解决方案5】:

      您需要将枚举值定义为 2 的幂:

      [Flags]
      public enum DisplayMode
      {
          None = 1,
          Dim = 2,
          Inverted = 4,
          Parse = 8,
          Italics = 16,
          Bold = 32
      }
      

      更多信息在这里:http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

      【讨论】:

        【解决方案6】:

        由于您使用的是标志,因此您需要以二进制方式思考,因此您应该每次将您的值增加 2 的倍数。例如,想想:

        0001 = 0x01,
        0010 = 0x02,
        0100 = 0x04,
        1000 = 0x08
        

        等等……

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多