.NET:bool vs enum作为方法参数

Jul*_*ain 7 .net code-design

每次我写一个带有表示选项的布尔参数的方法时,我发现自己在想:"我应该用枚举来替换它,这会使读取方法调用变得更容易吗?".

考虑以下一个对象,它接受一个参数来判断实现是否应该使用它的线程安全版本(我不是在这里问这样做这样做是不是好的设计,只是使用了布尔值):

public void CreateSomeObject(bool makeThreadSafe);
CreateSomeObject(true);
Run Code Online (Sandbox Code Playgroud)

当调用在声明旁边时,参数的目的当然显而易见.当它在一些你几乎不知道的第三方库中时,很难立即看到代码的作用,相比之下:

public enum CreationOptions { None, MakeThreadSafe }
public void CreateSomeObject(CreationOptions options);
CreateSomeObject(CreationOptions.MakeThreadSafe);
Run Code Online (Sandbox Code Playgroud)

它更好地描述了意图.

当有两个表示选项的布尔参数时,情况变得更糟.看看ObjectContext.SaveChanges(bool)Framework 3.5和4.0之间发生了什么.它已被淘汰,因为已经引入了第二个选项,并且整个事物已经转换为枚举.

虽然在有三个或更多元素的情况下使用枚举似乎很明显,但在这些特定情况下,您对使用枚举而不是布尔值有什么看法和经验?

Mar*_*ers 7

.NET 4.0可能对此有所帮助.您可以使用命名参数:

CreateSomeObject(makeThreadSafe : true);
Run Code Online (Sandbox Code Playgroud)

对于旧版本,改为创建临时变量会很有用.

bool makeThreadSafe = true;
CreateSomeObject(makeThreadSafe);
Run Code Online (Sandbox Code Playgroud)