代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  5
  • Mark  · 技术社区  · 15 年前

    在python中,*允许我将列表作为函数参数传递:

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

    我可以用数组在C中复制这种行为吗?

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  9
  •   Lasse V. Karlsen    15 年前

    除:

    1. 更改方法签名以接受数组
    2. 添加接受数组、提取值并调用原始重载的重载
    3. 使用反射调用方法

    不幸的是,不,你不能这样做。

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

    注意,可能有几个很好的理由来解释为什么不支持它,但我想到的是“为什么你需要这样做?”。通常,只有在将方法包装到另一层时才使用此模式,.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 });
            }
        }
    }
    
        2
  •  12
  •   thecoop    15 年前

    这个 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});
    
        3
  •  2
  •   Joshua Cauble    15 年前

    你可以用反射。但是,如果它一直是一个可变的长度,那么最好使用数组作为方法定义,但是您仍然需要解析列表,除非它是可以由集合方法/数组方法处理的基本需求。

        4
  •  1
  •   Sapph    15 年前

    我相当肯定你可以使用反射来访问你的方法,然后使用 Invoke ,使用数组作为参数列表。不过,有点绕圈子。