所以,我只是讨厌使用true
/ false
作为“启用”/“禁用”的方法参数。要自由引用杰夫:“我在基础层面上不喜欢它。”
我反复发现自己在不同名称空间的每个新项目上定义自己的枚举,如下所示:
public enum Clickability
{
Disabled,
Enabled
}
public enum Editability
{
Disabled,
Enabled
}
public enum Serializability
{
Disabled,
Enabled
}
我可以在这些场景中使用通用枚举吗?
答案 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
参数的加载更具可读性。