【问题标题】:Pass multiple optional parameters to a C# function将多个可选参数传递给 C# 函数
【发布时间】:2010-01-03 21:38:34
【问题描述】:

有没有办法设置一个 C# 函数来接受任意数量的参数?例如,您是否可以设置一个功能以使以下所有功能都起作用 -

x = AddUp(2, 3)

x = AddUp(5, 7, 8, 2)

x = AddUp(43, 545, 23, 656, 23, 64, 234, 44)

【问题讨论】:

    标签: c# function parameters


    【解决方案1】:

    使用带有params 修饰符的参数数组

    public static int AddUp(params int[] values)
    {
        int sum = 0;
        foreach (int value in values)
        {
            sum += value;
        }
        return sum;
    }
    

    如果您想确保至少有 一个 值(而不是可能为空的数组),请单独指定:

    public static int AddUp(int firstValue, params int[] values)
    

    (在实现中将sum 设置为firstValue。)

    请注意,您还应该以正常方式检查数组引用是否为空。在该方法中,参数是一个完全普通的数组。参数数组修饰符仅在您 调用 方法时产生影响。基本上编译器会转:

    int x = AddUp(4, 5, 6);
    

    变成这样的:

    int[] tmp = new int[] { 4, 5, 6 };
    int x = AddUp(tmp);
    

    可以使用完全正常的数组来调用它 - 所以后一种语法在源代码中也是有效的。

    【讨论】:

    • public static int AddUp(params int[] values) 中,values 将始终是T[] 类型?不能是params IEnumerable<T> valuesparams List<T> values 类型。我尝试使用params IEnumerable<T> values,但它给了我错误,后来使用params IEnumerable<T>[] values 解决了这个问题。为什么会这样?
    • @barnes: params 仅适用于数组类型(目前;已经有人提议允许其他类型)。您几乎可以肯定想要params IEnumerable<T>[],因为那将是一个序列数组。
    【解决方案2】:

    C# 4.0 还支持可选参数,这在某些其他情况下可能很有用。请参阅this 文章。

    【讨论】:

      【解决方案3】:

      1.你可以制作重载函数。

      SomeF(strin s){}   
      SomeF(string s, string s2){}    
      SomeF(string s1, string s2, string s3){}   
      

      更多信息:http://csharpindepth.com/Articles/General/Overloading.aspx

      2.或者您可以使用参数创建一个函数

      SomeF( params string[] paramArray){}
      SomeF("aa","bb", "cc", "dd", "ff"); // pass as many as you like
      

      更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/params

      3.或者你可以使用简单的数组

      Main(string[] args){}
      

      【讨论】:

      • 这里给出的示例 1 中的重载是不必要的,因为该函数可以写成: SomeF(string s, string s2 = "", string s3 = ""){ }
      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多