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

Joh*_*ell 6 .net c# enums

所以,我只是讨厌使用true/ false作为"启用"/"禁用"的方法参数.要自由引用杰夫:"我从根本上不喜欢它".

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

public enum Clickability
{
    Disabled,
    Enabled
}

public enum Editability
{
    Disabled,
    Enabled
}

public enum Serializability
{
    Disabled,
    Enabled
}
Run Code Online (Sandbox Code Playgroud)

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

Shu*_*oUk 7

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

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

public static void Foo(bool useBaz)

public static void Foo(Ability useBaz)
Run Code Online (Sandbox Code Playgroud)

然后Foo(true),对于大多数人来说,经文Foo(Ability.Enabled)Foo(false)经文Foo(Ability.Disabled)都非常明显.

但是当你点击一个方法时:

public static void Foo(
    bool useBaz, 
    bool barIsHigh, 
    bool useFlibble, 
    bool ignoreCase)
Run Code Online (Sandbox Code Playgroud)

那么重要的不是你是否使用布尔值或一般枚举,他们仍然在呼叫站点看起来像这样:

Foo(false,true,false,false);
Foo(Ability.Enabled,Ability.Enabled,Ability.Disabled,Ability.Enabled);
Run Code Online (Sandbox Code Playgroud)

两者都不漂亮.

使用针对案例的特定枚举:

enum BarOption { Off, On }
enum BazConsidered { Low, High }
enum FlibbleOption { Off,  On  }
// for case sensitivity use System.StringComparison
Run Code Online (Sandbox Code Playgroud)

然后你得到

Foo(Bar.On,
    BazConsidered.Low,
    FlibbleOption.On,
    StringComparison.IgnoreCase );
Run Code Online (Sandbox Code Playgroud)

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

[Flags]
enum FooOptions
{
    None = 0,
    UseBaz = 1,
    BazConsideredHigh = 2,
    UseFlibble = 4,
}
Run Code Online (Sandbox Code Playgroud)

然后你会有:

Foo(FooOptions.UseBar | FooOptions.UseFlibble, StringComparison.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

适当选择"活动"标志以便仅指定不常见的标记将导致突出显示"不常见"用法.