1

C#4.0 通过在方法中允许默认参数引入了一个非常奇特和有用的东西。但是 C#3.0 没有。因此,如果我想模拟“默认参数”,我必须创建两个该方法,一个带有这些参数,一个没有这些参数。我有两种方法可以做到这一点。

版本 A - 调用其他方法

public string CutBetween(string str, string left, string right, bool inclusive)
{
    return str.CutAfter(left, inclusive).CutBefore(right, inclusive);
}

public string CutBetween(string str, string left, string right)
{
    return CutBetween(str, left, right, false);
}

版本 B - 复制方法体

public string CutBetween(string str, string left, string right, bool inclusive)
{
    return str.CutAfter(left, inclusive).CutBefore(right, inclusive);
}

public string CutBetween(string str, string left, string right)
{
    return str.CutAfter(left, false).CutBefore(right, false);
}

这些之间有什么真正的区别吗?这不是关于优化或资源使用或任何东西的问题(尽管它的一部分是我保持一致的总体目标),我什至认为选择一种方法或另一种方法没有任何显着影响,但我发现它询问这些事情要比错误地假设更明智。

4

3 回答 3

4

唯一真正的区别是维护。第二个版本本质上是一种代码复制形式,如果您需要更改这些代码的实现,您将需要做更多的工作(可能还有更多的测试要运行)。

否则,它们在其他所有方面基本相同 - 在第一种情况下,您将在调用堆栈上有一个额外的方法,这不会对性能或资源使用产生任何明显影响(如您所说,不是优化问题)。

鉴于此,当我需要同一方法的多个重载时,我倾向于执行您在第一个示例中所做的事情 - 有几个重载方法都调用相同的“通用”方法。

于 2010-05-28T17:23:30.577 回答
1

一个区别是,如果在第一个版本中CutAfterCutBefore签名因任何原因发生更改,您只需要更新一行,而在第二个版本中,您必须更新与方法一样多的行。

于 2010-05-28T17:23:44.253 回答
1

行为不会有任何区别,不 - 但版本 B显然不仅仅是应用默认值。您需要仔细阅读代码以确认没有细微差别。我认为最好通过一个包含真实逻辑的“主”方法来汇集任何默认值。这也使得以后更改逻辑更容易——您只需在一个地方进行。

于 2010-05-28T17:25:20.287 回答