【问题标题】:Creating methods with infinite parameters?创建具有无限参数的方法?
【发布时间】:2011-01-27 00:06:09
【问题描述】:

在 C# 中你可以这样做:

foo = string.Format("{0} {1} {2} {3} ...", "aa", "bb", "cc" ...);

此方法Format() 接受无限参数,作为第一个应该如何格式化字符串的参数,其余的是要放入字符串中的值。

今天我遇到了一种情况,我必须获取一组字符串并对其进行测试,然后我想起了这种语言功能,但我不知道。在几次不成功的网络搜索之后,我意识到只获取一个数组会更谨慎,但这并没有让我很满意。

问:如何制作一个接受无限参数的函数?以及如何使用它?

【问题讨论】:

  • infinite...这是很多参数。你试过了吗?
  • 学究点,绝不是“无限”;但任何 sane 代码都应该没问题。
  • 如果有人有无限的记忆,我会感到惊讶。我想要一些!
  • @Christian.K 我认为这样更清楚,因为这是我最初的问题,可能更容易与其他人可能遇到的类似疑问联系起来。而且(一般来说)这是一种创建重载的虚拟方式(如果你把其中一个弄错了,Visual Studio 会抱怨说“没有一个重载接受这些参数”或类似的东西)
  • @MarceloRamires:我试图指出这样一个事实,即“params”关键字,这就是您给出的示例的全部内容,与任何其他参数列表一样,与重载有关方法,而是允许使用“无限项”的 array 调用方法。但说真的,这是你的问题,所以如果标题说明你想知道/问什么,一定要保持这样(我可能误解了,很公平:-)

标签: c# .net function overloading


【解决方案1】:

使用params 关键字。

这是一个例子:

    public int SumThemAll(params int[] numbers)
    {
        return numbers.Sum();
    }

    public void SumThemAllAndPrintInString(string s, params int[] numbers)
    {
        Console.WriteLine(string.Format(s, SumThemAll(numbers)));
    }

    public void MyFunction()
    {
        int result = SumThemAll(2, 3, 4, 42);
        SumThemAllAndPrintInString("The result is: {0}", 1, 2, 3);
    }

代码显示了各种各样的东西。首先,带有params 关键字的参数必须始终位于最后(每个函数只能有一个)。此外,您可以通过两种方式调用带有params 参数的函数。第一种方法在MyFunction 的第一行中进行了说明,其中每个数字都作为单个参数添加。但是,它也可以使用数组调用,如 SumThemAllAndPrintInString 中所示,它调用 SumThemAllint[] 调用 numbers

【讨论】:

  • @MarceloRamires:点击链接。无论如何,我无法比文档更好地解释它;-)
  • 其实可以;这个解释只是两行加上一个例子。并不是说文档不够好,只是说如果您愿意,可以更好地解释它。
  • @MarceloRamires: string.Format("{0} {1} {2} {3}", "aa", "bb", "cc") 看起来像 Format(params object[] args) 其中 args = {"aa", "bb", "cc"}。有意义吗?
  • @MarceloRamires 我已经详细说明了。希望这是有道理的。
  • 如果您将string.Format 删除为Console.WriteLine(s, SumThemAll(numbers)),情况是否相同?
【解决方案2】:

使用 params 关键字。用法:

public void DoSomething(int someValue, params string[] values)
{
    foreach (string value in values)
        Console.WriteLine(value);
}

使用 params 关键字的参数总是在最后。

【讨论】:

  • 最后应该是无限值吧?如果我想要一个整数,它必须在开头,对吗?
  • @MarceloRamires - 正确,它必须在末尾。
  • @MarceloRamiers - 你的方法看起来像 public void DoSomething(int myvalue, params string[] values)
【解决方案3】:

一些笔记。

需要在数组类型上标记参数,例如 string[] 或 object[]。

标记为 w/ params 的参数必须是方法的最后一个参数。以 Foo(string input1, object[] items) 为例。

【讨论】:

    【解决方案4】:

    使用params 关键字。例如

    static void Main(params string[] args)
    {
        foreach (string arg in args)
        {
            Console.WriteLine(arg);
        }
    }
    

    【讨论】:

    • 谢谢,但是……“我该如何使用它?”
    【解决方案5】:

    您可以通过使用params 关键字来实现此目的。

    小例子:

    public void AddItems(params string[] items)
    {
         foreach (string item in items)
         { 
             // Do Your Magic
         }
    }
    

    【讨论】:

      【解决方案6】:
          public static void TestStrings(params string[] stringsList)
          {
              foreach (string s in stringsList){ } 
                  // your logic here
          }
      

      【讨论】:

        【解决方案7】:
         public string Format(params string[] value)
         {
                    // implementation
         }
        

        使用了params关键字

        【讨论】:

          【解决方案8】:
          function void MyFunction(string format, params object[] parameters) {
          
          }
          

          instad of object[] 你可以使用任何你喜欢的类型。 params 参数必须是最后一行。

          【讨论】:

            猜你喜欢
            • 2011-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-13
            • 2013-10-03
            • 2018-10-02
            • 2017-08-29
            相关资源
            最近更新 更多