代码之家  ›  专栏  ›  技术社区  ›  Johann Gerell

BCL中是否有(隐藏良好的)通用枚举用于启用/禁用?

  •  6
  • Johann Gerell  · 技术社区  · 16 年前

    所以,我只是 憎恨 使用 true / false 作为“已启用”/“已禁用”的方法参数。自由引用杰夫的话:“我从根本上不喜欢它。”

    我反复发现自己在各地不同名称空间中的每个新项目上定义自己的枚举,如下所示:

    public enum Clickability
    {
        Disabled,
        Enabled
    }
    
    public enum Editability
    {
        Disabled,
        Enabled
    }
    
    public enum Serializability
    {
        Disabled,
        Enabled
    }
    

    是否有可用于这些方案的通用枚举?

    3 回复  |  直到 16 年前
        1
  •  7
  •   ShuggyCoUk    16 年前

    这一点的问题在于,在真正的有问题的情况下(即存在多个参数并且不清楚“标志”控制的是什么),它实际上没有帮助。

    如果你遵循“避免双重否定”的原则,那么简单的单乳房就可以了:

    public static void Foo(bool useBaz)
    
    public static void Foo(Ability useBaz)
    

    然后 Foo(true) 诗句 Foo(Ability.Enabled) Foo(false) 诗句 Foo(Ability.Disabled) 对大多数人来说确实很明显。

    但是,当您使用如下方法时:

    public static void Foo(
        bool useBaz, 
        bool barIsHigh, 
        bool useFlibble, 
        bool ignoreCase)
    

    那么,不管你是使用布尔型还是普通枚举型,它们最终都会在调用站点上看起来像这样:

    Foo(false,true,false,false);
    Foo(Ability.Enabled,Ability.Enabled,Ability.Disabled,Ability.Enabled);
    

    也不是很漂亮。

    使用 具体的 现有案例的枚举:

    enum BarOption { Off, On }
    enum BazConsidered { Low, High }
    enum FlibbleOption { Off,  On  }
    // for case sensitivity use System.StringComparison
    

    然后你得到

    Foo(Bar.On,
        BazConsidered.Low,
        FlibbleOption.On,
        StringComparison.IgnoreCase );
    

    或者,如果所有都是简单的布尔状态,并且可能保持不变,那么使用标记的枚举更好。

    [Flags]
    enum FooOptions
    {
        None = 0,
        UseBaz = 1,
        BazConsideredHigh = 2,
        UseFlibble = 4,
    }
    

    那么你应该有:

    Foo(FooOptions.UseBar | FooOptions.UseFlibble, StringComparison.IgnoreCase);
    

    适当选择“活动”标志,以便只指定不常见的内容,然后突出显示“不常见”用法。

        2
  •  0
  •   Fredrik Mörk    16 年前

    不,BCL中没有这样的枚举(据我所知)。但不难从你反复创造的作品中选一个,使其更具普遍性:

    public enum Ability
    {
        Disabled,
        Enabled
    }
    

    把它和一些类似的一般东西放在类库中,然后在项目中重用它。

        3
  •  0
  •   LukeH    16 年前

    使用有什么问题 bool 具有有意义名称的参数?

    public void Foo(bool clickabilityEnabled, bool editabilityEnabled) { ... }
    

    或者,更好的是,不要那么冗长:

    public void Bar(bool isClickable, bool isEditable, bool isSerializable) { ... }
    
    public void Baz(bool canClick, bool canEdit, bool canSerialize) { ... }
    

    我会发现这比一大堆 enum 参数。