【问题标题】:Flags enum in .NET.NET 中的标志枚举
【发布时间】:2009-04-10 19:52:25
【问题描述】:

我正在尝试使用一组条件语句来设置带有 [Flags] 属性的枚举。但是,编译器抱怨 'm' 未分配。如何重写以下内容以实现我的预期功能?

Media m;
if (filterOptions.ShowAudioFiles)
    m = m | Media.Audio;
if (filterOptions.ShowDocumentFiles)
    m = m | Media.Document;
if (filterOptions.ShowImageFiles)
    m = m | Media.Image;
if (filterOptions.ShowVideoFiles)
    m = m | Media.Video;

【问题讨论】:

    标签: c# .net enums enum-flags


    【解决方案1】:

    你需要初始化 m。然后创建一个值为 0 的“无”标志:

    Media m = Media.None;
    

    然后是你的其余代码。

    【讨论】:

      【解决方案2】:

      你也可以写:

      Media m = default(Media)
      

      在您不知道枚举、类或它是否是值/引用类型的情况下很有用。

      【讨论】:

      • 这真是个坏主意,它隐藏了枚举的整个简单性。创建它们是为了删除幻数,当您应该使用 None 的标志枚举时,您将其添加回来。
      • 好点。我在考虑您不是作者的情况,但无论如何明确选择默认值会更好。
      【解决方案3】:

      如果没有一个条件为真,m 将是未定义的。将其设置为初始值。

      【讨论】:

        【解决方案4】:

        你有像 filterOptions.ShowNone 这样的“默认”吗?如果是这样,从设置 m 开始。编译器抱怨是因为在所有 if 的末尾,m 可能没有设置为任何值。

        【讨论】:

          【解决方案5】:

          除了上面的答案之外,除了这段代码看起来相当多余之外,我想建议你使用 Select Case 而不是那些丑陋的 If。

          【讨论】:

          • 考虑到可以设置任何标志组合,我看不出选择案例如何合适。
          • 同意,-1 因为你不能用开关替换那些 ifs。
          【解决方案6】:

          您实际上不需要创建Media.None。您可以将任何值强制转换为 Flag 枚举,即使它不等于标志的值。

          Media m = (Media)0;
          
          if (filterOptions.ShowAudioFiles)     m |= Media.Audio; 
          
          if (filterOptions.ShowDocumentFiles)  m |= Media.Document; 
          
          if (filterOptions.ShowImageFiles)     m |= Media.Image; 
          
          if (filterOptions.ShowVideoFiles)     m |= Media.Video;
          

          【讨论】:

          • 如果所有条件都失败了怎么办?如果 0 是例如媒体.音频?你需要一个有效的初始值。
          • 这是个坏建议。使用显式值总是比依赖整数强制转换更好。
          • 并非如此。即使没有设置“有效”标志,枚举仍然可以正常工作。还是会有价值的。默认情况下,所有枚举都继承自“Int32”。是的,如果您不处理默认值,以后可能会出现其他问题。但这就是例外的原因。
          • 因为它是一个标志枚举,None 值应该映射到 0(没有设置位)。以任何其他方式进行操作只会很奇怪。另一方面,您可能需要一个 Media.Default 确实设置了一些位。
          • 哎哟。所以你等到稍后引发异常而不是在最开始的地方正确初始化你的数据?哎哟。
          猜你喜欢
          • 2012-03-08
          • 2010-12-10
          • 2013-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多