是否可以更改可选参数的值

时间:2015-07-28 11:59:01

标签: c# coding-style refactoring optional-parameters

更改参数值被视为反模式,但我发现它有时在C#中使用可选参数:

public void Foo(int p1, MyClass fooObj = null)
{
    if (fooObj == null)
    {  
        fooObj = LoadFooObj(....
    }

    . . .
}

这可能有害于我可能会丢失吗?

感谢。

3 个答案:

答案 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完全相反,并说这不好,原因有两个:

  1. 应尽可能将所有变量(包括参数)视为不可变。只有你真的需要改变他们的价值。这样可以使代码更清晰,更易于理解。
  2. 避免使用可选参数。一个带有可选参数的方法,然后立即测试该参数是一个明确的代码气味:你有两条路径通过代码,所以让它成为两个方法。
  3. 你可以重载Foo,但想想这些方法的作用:它们可能应该被赋予不同的名称来描述它们做不同事情的事实。不要依赖评论来解释这一点;用代码本身清楚说明。