如何传递可选参数

时间:2012-09-25 07:00:10

标签: c# optional-parameters

我有一个函数有两个固定的参数。但是下一个论点并不固定,可能有两个或三个或四个。

这是一个运行时参数,所以如何定义该函数?

我的代码如下:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, dynamic arguments comming it should be 2 or 3)
        {

        return null;
    }

3 个答案:

答案 0 :(得分:12)

1)params (C# Reference)

public ObservableCollection<ERCErrors>ErrorCollectionWithValue
                (string ErrorDode, int MulCopyNo, params object[] args)
{
    //...
}

2)Named and Optional Arguments (C# Programming Guide)

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, object arg1 = null, int arg2 = int.MinValue)
{
    //...
}

3)也许简单的方法overloading仍然适合更好,将方法逻辑分离到不同的方法?在此链接下,您还可以找到命名和可选参数的另一种描述

答案 1 :(得分:5)

一种方法是重载方法

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1)
{
   //do some thing with param1
}

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1,int param2)
{
   //do some thing with param1 and param3
}

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1, int param2, int param3)
    {
       //do some thing with param1, param2 and param3
    }

然后所有这些都是有效的

var err = ErrorCollectionWithValue("text", 10, 1);
var err = ErrorCollectionWithValue("text", 10, 1,2);
var err = ErrorCollectionWithValue("text", 10, 1,2,3);

另一种方法是使用可选参数。有了这个,你只需要一种方法,而不是第一种方法中的3种方法。

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1 = 0, int param2 = 0, optional int param3 = 0)
{

}

这些仍然有效

var err = ErrorCollectionWithValue("text", 10, 1); //defaults param2 and param3 to 0
var err = ErrorCollectionWithValue("text", 10, 1,2); //defaults param3 to 0
var err = ErrorCollectionWithValue("text", 10, 1,2,3);

要跳过任何可选参数,您需要使用仅在C#4.0及更高版本中支持的named parametersthis

var err = ErrorCollectionWithValue("text", param3: 5); //skipping param1 and param2

在另外两种方法中,您不能跳过参数的顺序。

答案 2 :(得分:2)

如果参数的数量可能不同,您可以使用params

public ObservableCollection<ERCErrors> ErrorCollectionWithValue(string errorCode, int num, params object[] args) 
{ 
  foreach(object obj in args)
{
  //process args.
}
}