在C#5.0中哪种情况下你会使用另一种情况:可选参数与方法重载?
答案 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
但我不能这样做,因为在编译时我得到了
“可选参数必须是编译时常量
所以你必须考虑到重载你可以解决像这样的问题,使用两个不同的签名和机会初始化参数。