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

时间:2009-08-20 08:32:21

标签: c# .net enums

所以,我只是讨厌使用true / false作为“启用”/“禁用”的方法参数。要自由引用杰夫:“我在基础层面上不喜欢它。”

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

public enum Clickability
{
    Disabled,
    Enabled
}

public enum Editability
{
    Disabled,
    Enabled
}

public enum Serializability
{
    Disabled,
    Enabled
}

我可以在这些场景中使用通用枚举吗?

3 个答案:

答案 0 :(得分:7)

这个问题在于它实际上并没有帮助解决真正有问题的情况,即当有多个参数并且不清楚'标志'是在控制什么时。

如果你遵循规则,你应该'避免双重否定',那么简单的单一布尔值就可以了:

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 );

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

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

然后你会:

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

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

答案 1 :(得分:0)

不,BCL中没有这样的枚举(据我所知)。但是,要重复创建并使其更加通用的其中一个并不难:

public enum Ability
{
    Disabled,
    Enabled
}

将其粘贴到具有类似通用内容的类库中,并在项目中重复使用。

答案 2 :(得分:0)

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参数的加载更具可读性。