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

C# 是否可以更改可选参数的值,c#,coding-style,refactoring,optional-parameters,C#,Coding Style,Refactoring,Optional Parameters,更改参数值被认为是一种反模式,但我发现在C#中使用可选参数有时很有用: 这里有什么我可能遗漏的潜在危害吗 谢谢。如果你觉得它有味道,不如来一个简单的过载 public void Foo(int p1, MyClass fooObj) { . . . } public void Foo(int p1) { var fooObj = LoadFooObj(....); Foo(p1, fooObj); } 这样就可以清楚地知道每个方法都做了什么,并且不改变调用中的参数。这

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

这里有什么我可能遗漏的潜在危害吗


谢谢。

如果你觉得它有味道,不如来一个简单的过载

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 >代码>被用作一个“正常”有意义的值尽管考虑是否在特定的上下文中需要它。

< P>我会和乔恩Sketa完全相反的说它不好有两个原因:

  • 应尽可能将所有变量(包括参数)视为不可变的。只有在必要时才改变它们的价值。这将导致更清晰、更容易理解的代码
  • 避免使用可选参数。一个带有可选参数的方法会立即测试该参数,这是一种清晰的代码气味:代码中有两条路径,所以将其设为两个方法

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

    这是很常见的,没问题。不改变参数值的想法可能是针对人们过去编写的100多行方法。如果你只有短方法,这不会成为问题。是的,你的代码看起来不错,谢谢。关键是我不确定原始代码是否有味道)唯一的问题是,如果没有选项,很难筛选出调用它的位置。如果你把它们分开,你可以很容易地在IDE中找到所有的引用。如果你想要有多个可选参数,这也是一个棘手的问题——重载的数量急剧增加。这就是为什么我尝试对参数超过1-2个的方法使用命名参数调用和/或在参数从方法名称看不明显的地方使用命名参数调用的原因之一。当然,这也有助于避免在调用编码后,签名中的一个或多个参数被类型兼容的参数替换(和/或在Params参数的情况下,删除)时出现意外参数。事实上,我认为应该有一个需要命名参数的“参数显式”编译器选项(VB中的la“option Explicit”)。请参阅:我不明白(2)为什么特别适用于可选参数。当然,同样的逻辑也适用于任何参数,不管它是否有默认值?那么它是否也适用于任何带有布尔参数的方法?我可以有两个名称稍有不同的方法。@ArturUdod,这个规则绝对应该应用于布尔参数。@MatthewWatson,你说得对。任何用作测试以在代码的两个不同路径之间进行选择的参数都有一种“此处可能需要两种方法”的味道。
    public void Log(string message, DateTime? timestamp = null)
    {
        DateTime actualTimestamp = timestamp ?? DateTime.UtcNow;
        ...
    }