C#5.0可选参数与方法重载

时间:2012-11-09 15:22:13

标签: c#

在C#5.0中哪种情况下你会使用另一种情况:可选参数与方法重载?

6 个答案:

答案 0 :(得分:5)

如果函数的内部实现完全不同,则使用方法重载。否则,使用可选参数。

可选参数方法允许您编写单个测试方法,而不是为每个重载方法编写测试方法

答案 1 :(得分:1)

如果要执行某个方法而不让调用者指定所有参数,则应使用可选参数。

例如

private void method (int a, int b = 0){}// if B is optional

当您在方法调用中更改参数类型时,应使用方法重载。

private void method (double a, int b = 0){}// type of parameter a is different - use overload

您可以同时使用它们,因此它不是/或。它们的目的各不相同。

答案 2 :(得分:1)

我发现当我将一个开关添加到一个已经很简单的方法时,我会使用一个可选参数,例如

public List<Stuff> GetItems (Guid stuffID, bool includeDeleted = false)
{
   //implementation
}

优点是GetItems方法可能已经在应用程序的其他方面广泛使用,您不希望必须为每次使用添加参数。

当您拥有一个包含大量参数的方法,并且管理哪些是可选的以及哪些不是一件苦差事时,可选参数会成为问题。在这种情况下,您需要开始命名您提供的参数。我觉得有点混乱

比上面的例子更复杂的事情应该真的使用重载。我想不出一个例子,我会使用多个可选参数。

答案 3 :(得分:0)

正如所指出的,可选参数必须位于列表的末尾。但在大多数情况下,这并不重要。

有迹象表明,许多.NET类使用重载的唯一原因是因为在编写这些类时,可选参数不可用。所以我通常发现可选参数比我的方法的多个版本更容易编写。

但是,我真的没有看到任何正确或错误的方式。

答案 4 :(得分:0)

在某些情况下,方法重载可以替换为可选参数,但它们并不完全相同。有时我们仍然需要使用方法重载,例如:

void Foo()
{
    Foo(DateTime.Now);
}

void Foo(DateTime dt)
{
    //do something
}

//you can't use optional parameters here because DateTime.Now is not a constant
void Foo(DateTime dt = DateTime.Now)  //compile error
{
    //do something
}

对于某些情况都可以,我更喜欢可选参数,因为它使代码更短更清晰。

答案 5 :(得分:0)

我认为使用可选参数而不是重载并不重要,但我不得不说由于它们的“常量约束”而使用可选参数我遇到了问题。 我有一个DateTime类型的参数。 我想使用具有以下签名的函数:

void AddItem(string itemCode, Datetime defaultUpdateTime = DateTime.Now

但我不能这样做,因为在编译时我得到了

  

“可选参数必须是编译时常量

所以你必须考虑到重载你可以解决像这样的问题,使用两个不同的签名和机会初始化参数。