C#,将数组作为函数参数传递

6 投票
4 回答
2329 浏览
提问于 2025-04-15 17:46

在Python中,*这个符号让我可以把一个列表作为函数的参数传递:

def add(a,b): return a+b
x = [1,2]
add(*x)

我能在C#中用数组实现这个功能吗?

谢谢。

4 个回答

2

你可以使用反射。不过,如果这个长度总是变化的话,使用数组来定义你的方法可能会更好。不过,你还是需要解析这个列表,除非它是一些简单的需求,可以通过集合方法或数组方法来处理。

12

params 这个关键词可以实现类似的功能。

public int Add(params int[] numbers) {
    int result = 0;

    foreach (int i in numbers) {
        result += i;
    }

    return result;
}

// to call:
int result = Add(1, 2, 3, 4);
// you can also use an array directly
int result = Add(new int[] { 1, 2, 3, 4});
9

除了以下几种情况:

  1. 改变方法的签名,让它接受一个数组
  2. 添加一个重载方法,接受数组,提取值后再调用原来的重载
  3. 使用反射来调用这个方法

那么很遗憾,你不能这样做。

像Python那样基于关键字和位置的参数传递在.NET中是不支持的,除了通过反射。

需要注意的是,可能有几个很好的理由说明为什么不支持这种方式,但我想到的一个就是“你为什么需要这样做?”通常,只有在你把这个方法包裹在另一个层时,才会使用这种模式。而在.NET中,你有强类型的委托,所以通常剩下的就是基于反射的代码,即使这样,你通常也会对被调用的方法有很好的控制。

所以我的直觉反应是,即使我回答了你的问题,你也不应该这样做,而是找到一种更符合.NET的方式来实现你的目标。

下面是一个使用反射的例子:

using System;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        public Int32 Add(Int32 a, Int32 b) { return a + b; }
        static void Main(string[] args)
        {
            Program obj = new Program();

            MethodInfo m = obj.GetType().GetMethod("Add");
            Int32 result = (Int32)m.Invoke(obj, new Object[] { 1, 2 });
        }
    }
}

撰写回答