方法重载与C#4.0中的可选参数

时间:2010-07-23 08:09:42

标签: c# .net c#-4.0 overloading optional-parameters

哪一个更好?一目了然可选参数看起来更好(代码少,XML文档少等),但为什么大多数MSDN库类都使用重载而不是可选参数?

当您选择使用可选参数(或重载)时,是否有任何特殊事项需要注意?

11 个答案:

答案 0 :(得分:76)

“可选参数”和C#4.0中“命名参数”的一个很好的用例是,它为我们提供了一种优雅的方法重载替代方法,您可以根据参数的数量重载方法。

例如,您希望像foofoo()foo(1)foo(1,2)一样调用/使用方法foo(1,2, "hello")。使用方法重载,您将实现这样的解决方案,

///Base foo method
public void DoFoo(int a, long b, string c)
{
   //Do something
}  

/// Foo with 2 params only
public void DoFoo(int a, long b)
{
    /// ....
    DoFoo(a, b, "Hello");
}

public void DoFoo(int a)
{
    ///....
    DoFoo(a, 23, "Hello");
}

.....

使用C#4.0中的可选参数,您将实现如下的用例

public void DoFoo(int a = 10, long b = 23, string c = "Hello")

然后你可以使用这样的方法 - 注意使用命名参数 -

DoFoo(c:"Hello There, John Doe")

此调用将参数a的值设为10,将参数b设为23。 此调用的另一个变体 - 请注意,您不需要按照它们在方法签名中出现的顺序设置参数值,命名参数会使值显式。

DoFoo(c:"hello again", a:100) 

使用命名参数的另一个好处是它极大地增强了可读性,从而代码维护了可选参数方法。

注意一种方法如何在方法重载中定义3个或更多方法变得多余。我发现这是一个很好的用例,可以将可选参数与命名参数结合使用。

答案 1 :(得分:57)

答案 2 :(得分:37)

答案 3 :(得分:27)

答案 4 :(得分:9)

可选参数必须是最后一个。因此,您不能向该方法添加额外参数,除非它也是可选的。例如:

void MyMethod(int value, int otherValue = 0);

如果要为此方法添加新参数而不进行重载,则必须是可选的。喜欢这个

void MyMethod(int value, int otherValue = 0, int newParam = 0);

如果它不是可选的,那么你必须使用重载并删除'otherValue'的可选值。像这样:

void MyMethod(int value, int otherValue = 0);
void MyMethod(int value, int otherValue, int newParam);

我假设您希望保持参数的顺序相同。

因此,使用可选参数会减少您在课堂上需要的方法数量,但是它们必须是最后一个。

<强>更新 使用可选参数调用方法时,可以使用如下命名参数:

void MyMethod(int value, int otherValue = 0, int newValue = 0);

MyMethod(10, newValue: 10); // Here I omitted the otherValue parameter that defaults to 0

因此可选参数为调用者提供了更多可能性。

最后一件事。如果您使用方法重载与一个实现,如下所示:

void MyMethod(int value, int otherValue)
{
   // Do the work
}

void MyMethod(int value)
{
   MyMethod(value, 0); // Do the defaulting by method overloading
}

然后像这样调用'MyMethod':

MyMethod(100); 

将导致2​​个方法调用。但是如果你使用可选参数,那么只有一个'MyMethod'的实现,因此只有一个方法调用。

答案 5 :(得分:9)

答案 6 :(得分:4)

使用可选参数的好地方是 WCF ,因为它不支持方法重载。

答案 7 :(得分:2)

答案 8 :(得分:2)

这不是原始问题的答案,而是对@ NileshGule的answer的评论,但是:

a)我没有足够的声誉点来评论

b)多行代码很难在评论中阅读

Nilesh Gule写道:

  

使用可选参数的一个好处是,您不必在方法中进行条件检查,如果字符串为null,或者如果其中一个输入参数是字符串则为空。由于将为可选参数分配默认值,因此防御性编码将在很大程度上降低。

这实际上是不正确的,您仍然需要检查空值:

void DoSomething(string value = "") // Unfortunately string.Empty is not a compile-time constant and cannot be used as default value
{
  if(value == null)
    throw new ArgumentNullException();
}

DoSomething(); // OK, will use default value of ""
DoSomething(null); // Will throw

如果提供空字符串引用,则不会将其替换为默认值。所以你仍然需要检查空值的输入参数。

答案 9 :(得分:1)

使用可选参数的一个好处是,您不必在方法中进行条件检查,如果字符串为null,或者如果其中一个输入参数是字符串则为空。由于将为可选参数分配默认值,因此防御性编码将在很大程度上降低。

命名参数提供了以任何顺序传递参数值的灵活性。

答案 10 :(得分:1)

相关问题