更改参数值被视为反模式,但我发现它有时在C#中使用可选参数:
public void Foo(int p1, MyClass fooObj = null)
{
if (fooObj == null)
{
fooObj = LoadFooObj(....
}
. . .
}
这可能有害于我可能会丢失吗?
感谢。
答案 0 :(得分:4)
如果你认为它有气味,那么简单的过载怎么样呢。
public void Foo(int p1, MyClass fooObj)
{
. . .
}
public void Foo(int p1)
{
var fooObj = LoadFooObj(....);
Foo(p1, fooObj);
}
这样就清楚了每个方法的作用以及你不改变调用中的参数。
答案 1 :(得分:3)
这绝对没问题。实际上,这是一个使参数可选的好方法,而不必将值作为常量烘焙。
您可以使用null-coalescing运算符使其更具可读性:
fooObj = fooObj ?? LoadFooObj();
您甚至可以考虑对值类型使用相同的方法:
public void Log(string message, DateTime? timestamp = null)
{
DateTime actualTimestamp = timestamp ?? DateTime.UtcNow;
...
}
这样做的一个缺点是,它会阻止null
被用作“正常”有意义的值 - 考虑您是否在特定的上下文中需要它。
答案 2 :(得分:2)
我要与Jon Skeet完全相反,并说这不好,原因有两个:
你可以重载Foo
,但想想这些方法的作用:它们可能应该被赋予不同的名称来描述它们做不同事情的事实。不要依赖评论来解释这一点;用代码本身清楚说明。