【问题标题】:How To pass Optional Arguments如何传递可选参数
【发布时间】:2012-09-25 07:00:10
【问题描述】:

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

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

我的代码如下:

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

        return null;
    }

【问题讨论】:

标签: c# optional-parameters


【解决方案1】:

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 仍然更适合,将方法逻辑分离到不同的方法?在此链接下,您还可以找到命名参数和可选参数的另一种描述

【讨论】:

    【解决方案2】:

    一种方法是重载方法

    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);
    

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,这就是我想要的。
      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2016-04-03
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2014-06-30
      相关资源
      最近更新 更多