c# - BCL 中的任何地方是否有一个(隐藏得很好的)通用枚举用于启用/禁用?

标签 c# .net enums

所以,我只是讨厌使用true/false 作为“enabled”/“disabled”的方法参数。随意引用杰夫的话:“我从根本上不喜欢它”。

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

public enum Clickability
{
    Disabled,
    Enabled
}

public enum Editability
{
    Disabled,
    Enabled
}

public enum Serializability
{
    Disabled,
    Enabled
}

是否有可用于这些场景的通用枚举?

最佳答案

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

如果您遵循应“避免双重否定”的规则,那么简单的单个 bool 值就可以了:

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)

那么无论您使用 bool 值还是一般枚举都无关紧要,它们在调用站点上仍然看起来像这样:

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

或者,如果所有都是简单的 bool 状态并且可能保持这种状态,那么使用 Flagged 枚举更好。

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

那么你会:

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

Appropriate selection of the 'active' flags so that you specify only what is uncommon will then lead to highlighting 'uncommon' usages.

关于c# - BCL 中的任何地方是否有一个(隐藏得很好的)通用枚举用于启用/禁用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304794/

相关文章:

c# - 使用 StackExchange.Redis 的 Redis 键空间通知

c# - IIS7 应用程序请求路由 HTTPS

c# - 在 Web 应用程序中管理 MongoDB 对象生命周期

java - 在fasterxml中,反序列化json后,如果enum是类中的第一个属性,其他字段为null

c# - 如何重命名序列化为 XML 但继续支持以前名称的枚举?

c# - 如何在 C# 中比较字符的简短方式

c# - devexpress 饼图显示值的百分比

c# - 为什么在使用样本生成器时会得到循环引用 DummyApiController --> DummyApiController?

c# - Entity Framework 使用 IdentityDbContext 和代码优先自动迁移表位置和模式?

C# 枚举属性 null 与 0