在 C# 5.0 中的哪些情况下您会使用其中一种:可选参数与方法重载?
6 回答
如果函数的内部实现完全不同,则使用方法重载。否则,使用可选参数。
可选参数方法允许您编写单个测试方法,而不是为每个重载方法编写测试方法
我发现当我向一个已经很简单的方法添加一个开关时,我会使用一个可选参数,例如
public List<Stuff> GetItems (Guid stuffID, bool includeDeleted = false)
{
//implementation
}
优点是 GetItems 方法可能已经在应用程序的其他领域广泛使用,并且您不希望在每次使用时都添加参数。
当您有一个具有大量参数的方法时,可选参数会成为一个问题,并且管理哪些是可选的,哪些不是开始是一件苦差事。在这种情况下,您需要开始命名您提供的参数。我觉得有点乱
任何比上面的例子更复杂的东西都应该真正使用重载。我想不出一个我会使用多个可选参数的例子。
当您想要执行一个方法并且不让调用者指定所有参数时,应该使用可选参数。
例如。
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
您可以同时使用两者,因此它不是非此即彼的。他们都有非常不同的目的。
我认为使用可选参数而不是重载并不重要,但我不得不说我在使用可选参数时遇到了问题,因为它们的“恒定约束”。我有一个类型的参数DateTime
。我想使用具有以下签名的函数:
void AddItem(string itemCode, Datetime defaultUpdateTime = DateTime.Now
但我不能这样做,因为在编译时我得到了`
“可选参数必须是编译时常量
因此,您必须考虑通过重载,您可以使用两个不同的签名并适时地初始化参数来解决像这样的问题。
正如所指出的,可选参数必须位于列表的末尾。但在大多数情况下,这真的无关紧要。
有迹象表明,如此多的 .NET 类使用重载的唯一原因是因为在编写这些类时可选参数不可用。所以我通常发现可选参数比我的方法的多个版本更容易编写。
但是,再一次,我真的没有看到任何正确或错误的方式。
在少数情况下,方法重载可以被可选参数替换,但它们并不完全相同。有时我们仍然需要使用方法重载,例如:
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
}
对于某些情况,两者都可以,我更喜欢可选参数,因为它使代码更短更清晰。