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

Is it OK to change values of optional parameters

更改参数值被认为是一种反模式,但我发现它有时对 C# 中的可选参数很有用:

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

    . . .
}

我可能遗漏了这里可能有害的东西吗?

谢谢。

如果您觉得它有异味,不妨改用简单的重载。

public void Foo(int p1, MyClass fooObj)
{
    . . .
}

public void Foo(int p1)
{
    var fooObj = LoadFooObj(....);
    Foo(p1, fooObj);
}

这样可以清楚每个方法的作用,并且您不会更改调用中的参数。

太好了。事实上,这是一种使参数可选的好方法,而不必将值作为常量烘焙。

不过,您可以使用空合并运算符使其更具可读性:

fooObj = fooObj ?? LoadFooObj();

您甚至可以考虑对值类型使用相同的方法:

public void Log(string message, DateTime? timestamp = null)
{
    DateTime actualTimestamp = timestamp ?? DateTime.UtcNow;
    ...
}

这样做的一个缺点是它会阻止 null 被用作 "normal" 有意义的值 - 考虑在特定情况下您是否需要它。

我要与 Jon Skeet 完全相反,并说它不好,原因有二:

  1. 尽可能将所有变量(包括参数)视为不可变的。仅在确实需要时才更改它们的值。这会使代码更清晰、更容易理解。
  2. 避免使用可选参数。带有可选参数然后立即测试该参数的方法是一种明显的代码味道:代码有两条路线,因此将其设为两种方法。

您可以重载 Foo,但请考虑这些方法的作用:它们可能应该被赋予不同的名称以描述它们做不同事情的事实。不要依靠评论来解释这一点;用代码本身说清楚。