如何在方法中添加可选参数?

时间:2009-05-05 09:00:26

标签: c# methods

是否可以在方法中声明可选参数?

例如,在delphi中,我可以做类似的事情:

procedure Test(p1:integer;p2:integer;p3:integer = 2;p4:integer = 4)

当我调用该函数时,我可以用四个参数或两个参数调用它:

Test(2,3); //p3 = 2,p4 = 4.
Test(2,3,4,5); //p3 = 4,p4 = 5;

在C#中怎么可能?

7 个答案:

答案 0 :(得分:5)

我担心这在C#1到3中是不可能的。然而,好消息是,因为它是一个非常需要的功能(虽然肯定有些人宁愿不看它),微软终于有了决定将它添加到C#4。

C#4语法如下:

public static void SayHello(string s = "Hello World!")
{
    Console.WriteLine(s);
}

用法:

SayHello(); // Prints "Hello World!"
SayHello("Hello."); // Prints "Hello."
SayHello(s: "Hello."); // Prints "Hello."

(最后一个例子使用了一个命名参数,在这种情况下实际上并不是必需的,但是当你有多个可选参数时会有所帮助。)

您可以在this blog post上了解有关该主题的更多信息。

答案 1 :(得分:4)

您必须等待C# 4.0,它支持可选参数,或使用标准重载机制:

void Test(int p1, int p2, int p3, int p4)
{ }

void Test(int p1, int p2)
{
    Test(p1, p2, 2, 4);
}

答案 2 :(得分:4)

可以在C#4.0中使用,但是,在发布之前,您可以通过创建方法的重载版本来解决它:

public void MyMethod( int a, int b, int c )
{
    ...
}

public void MyMethod( int a, int b)
{
   MyMethod(a, b, 4);
}

答案 3 :(得分:1)

您可以使用变量参数

使用params关键字。

void paramsExample(params int[] argsRest)
{

 if(argsRest.Length == 2) then...
 else if(argsRest.Length == 4) then...
 else error...

}

答案 4 :(得分:1)

using System;
using System.Runtime.InteropServices;

   public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
   {
      Console.WriteLine(s);
   }

完成! :)

答案 5 :(得分:0)

你还不能这样做。我认为这是一个feature of C# 4.0

您可以使用params作为解决方法,但这只能按顺序使用,而不是某些语言处理默认参数的方式。

答案 6 :(得分:0)

你使用像这样的重载

Test(int p1, int p2)
Test(int p1, int p2, int p3)

你可以让他们像这样调用私人方法

Test(int[] ps)

然后处理数据。

另一种处理这种情况的方法是不使用重载/可选参数,而是根据他们的工作来命名方法 - 这看起来似乎是一个糟糕的权衡,但你的代码可能会更容易阅读。 / p>