【问题标题】:Can you pass an 'expanded' array to a function in C# like in ruby?您可以像在 ruby​​ 中一样将“扩展”数组传递给 C# 中的函数吗?
【发布时间】:2009-10-31 22:24:38
【问题描述】:

在 ruby​​ 中,您可以执行以下操作:

def method(a, b) ... end
myMethod(*myArray)

因此,如果 myArray 有 2 个项目,则相当于:

myMehtod(myArray[0], myArray[1])

所以在方法体中,a == myArray[0] 和 b == myArray[1]

你能在 C# 中做到这一点吗? (所以我可以使用显式参数声明一个方法,而不仅仅是将数组作为参数)

编辑:我应该更具体地说明被调用的方法。

【问题讨论】:

    标签: c# methods


    【解决方案1】:

    您的方法可以通过params 声明为接受参数数组:

    void F(params int[] foo) {
        // Do something with foo.
    }
    

    现在您可以将任意数量的ints 传递给该方法,也可以将int 的数组传递给该方法。但是给定一个固定的方法声明,你不能像在 Ruby 中那样动态扩展一个数组,因为参数在底层的处理方式不同(我相信这在 Ruby 中是不同的),并且因为 C# 没有那么动态。

    理论上,你可以使用反射来调用方法来达到同样的效果,但是(反射的方法调用总是接受一个参数数组)。

    【讨论】:

    • 我可能不得不最终使用反射的东西来让它按我想要的方式工作,但这很有趣。谢谢!
    【解决方案2】:

    如果您使用 params 关键字声明函数的参数,则可以传入数组或任意数量的单个参数。

    例如:

    public class Foo
    {
        public static void Main()
        {
            int[] x = new int[] {1,2,3};
            Bar(x);
            Bar(10,11,12);
        }
    
        public static void Bar(params int[] quux)
        {
            foreach(int i in quux)
            {
                System.Console.WriteLine(i);
            }
        }
    }
    

    生产

    1
    2
    3
    10
    11
    12
    

    【讨论】:

      【解决方案3】:

      不,当作为参数传递给 C# 方法时,您不能让数组“自动扩展”。模拟这种情况的一种方法是编写方法重载:

      MyMethod(int a, int b) { /* ... */ }
      
      MyMethod(int[] c)
      {
         // check array length?
         MyMethod(c[0], c[1]);
      }
      
      AnotherMethod()
      {
         int[] someArray = new[] {1,2};
      
         MyMethod(someArray); // valid
         MyMethod(1,2);       // valid
      }
      

      但正如其他一些人已经提到的那样,使用params 关键字更简单(并且有点相反)。在我的示例(和您的示例)中,您最终总是拥有单独的 a 和 b。使用params,您总是有一个数组需要处理。

      【讨论】:

        【解决方案4】:

        你可以这样做:

        void MyMethod(params MyType[] args)
        {
        }
        
        
        MyMethod(myObject1, myObject2, myObject3);
        
        MyType[] a = { new MyType(),  new MyType() };
        MyMethod(a);
        

        【讨论】:

          【解决方案5】:

          我有一个PostServer(string path, params object[] objects) 方法将 json 发布到我的服务器。但在我发送我的对象数组之前,我会在它的前面添加一个会话令牌。

          string access_token = "<access_token>";
          string url = "http://example.com";
          
          void PostJson(string path, params object[] objects) {
              SendHttp(url + path, HttpMethod.POST, JSON.Stringify(objects));
          }
          
          void PostServer(string path, params object[] objects) {
              object[] moreObjects = new object[objects.Length + 1];
              object[0] = access_token;
              objects.CopyTo(moreObjects, 1);
              PostJson(path, moreObjects); // moreObjects will be expanded into PostJson objects
          }
          

          然后... PostServer("/greet", "Hello World!", true, 3.1415);

          会将 json ["&lt;access token&gt;","Hello World!",true,3.1415] 发送到我的服务器。

          实际上,我将moreObjects 直接放入JSON.Stringify,但你明白了。

          因此您可以扩展数组,但您将数组作为唯一的 params 参数传递。在coffeescript 中你可以使用PostJson(path, access_token, objects...),因为它有一个splat 运算符...。

          如果你在 c# 中尝试过PostJson(path, access_token, objects),你最终会发送 json ["&lt;access_token&gt;",["Hello World!",true,3.1415]]

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-01
            • 1970-01-01
            • 2013-01-20
            • 1970-01-01
            • 1970-01-01
            • 2018-04-08
            • 1970-01-01
            • 2020-12-26
            相关资源
            最近更新 更多