所以,我只是讨厌使用true/ false作为"启用"/"禁用"的方法参数.要自由引用杰夫:"我从根本上不喜欢它".
我反复发现自己在不同名称空间的每个新项目上定义自己的枚举,如下所示:
public enum Clickability
{
Disabled,
Enabled
}
public enum Editability
{
Disabled,
Enabled
}
public enum Serializability
{
Disabled,
Enabled
}
Run Code Online (Sandbox Code Playgroud)
我可以在这些场景中使用通用枚举吗?
这样做的问题在于它实际上并没有帮助解决真正有问题的情况,即当存在多个参数并且不清楚"标志"是什么控制时.
如果你遵循规则,你应该'避免双重否定',那么简单的单个布尔值就可以了:
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)
适当选择"活动"标志以便仅指定不常见的标记将导致突出显示"不常见"用法.