Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这些默认参数的人造模拟之间是否存在显著的机械差异?_C#_C# 3.0_Methods_Default Parameters - Fatal编程技术网

C# 这些默认参数的人造模拟之间是否存在显著的机械差异?

C# 这些默认参数的人造模拟之间是否存在显著的机械差异?,c#,c#-3.0,methods,default-parameters,C#,C# 3.0,Methods,Default Parameters,C#4.0引入了一个非常奇特和有用的东西,它允许在方法中使用默认参数。但C#3.0没有。因此,如果我想模拟“默认参数”,我必须创建其中两个方法,一个带有这些参数,另一个没有这些参数。我有两种方法可以做到这一点 版本A-调用其他方法 public string CutBetween(string str, string left, string right, bool inclusive) { return str.CutAfter(left, inclusive).CutBefore(r

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);
}

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

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

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


考虑到这一点,当我需要同一方法的多个重载时,我倾向于像你在第一个例子中所做的那样——让多个重载方法都调用同一个“通用”方法。

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

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


考虑到这一点,当我需要同一方法的多个重载时,我倾向于像您在第一个示例中所做的那样——让多个重载方法都调用相同的“常规”方法。

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

一个区别是如果
CutAfter
CutBefore
在第一个版本中,由于任何原因,签名更改只需要更新一行,而在第二个版本中,您必须更新尽可能多的行,因为您有方法。

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

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

Ooh,关于维护的真正好处。使用第一种方法意味着我只需要在某一点上改变事情。堆栈中的一个额外的方法并不会像浪费时间那个么大的潜力。哦,关于维护真的很好。使用第一种方法意味着我只需要在某一点上改变事情。堆栈中的一个额外方法并没有真正伤害到浪费时间的巨大潜力。