2009-10-31 68 views
5

在Ruby中,你可以做这样的事情:你可以传递一个'扩展'数组到C#中的函数,就像在ruby中一样吗?

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

所以,如果myarray的有2项,这将是这相当于:

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

因此,在方法体,一个== myArray [0]和b == myArray [1]

你可以在C#中执行此操作吗? (所以我可以有一个明确的参数声明的方法,而不是只是一个数组作为参数)

编辑:我应该已经更具体的方法被称为。

回答

9

你的方法可以声明为接受一个参数数组,通过params

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

现在,你可以通过一个任意该方法的编号为int,或者编号为int。但是给定一个固定的方法声明,你不能像在Ruby中一样快速地扩展一个数组,因为参数在引擎盖下的处理方式不同(我相信这在Ruby中是不同的),并且因为C#不是相当动态。

理论上,虽然(反映的方法调用总是接受参数数组),但您可以使用反射来调用方法以实现相同的效果。

+0

我可能会最终使用反射的东西,使其工作就是我想要的,但是这是有趣的。谢谢! – 2009-11-02 03:01:00

6

如果用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 
0

你可以这样做:

void MyMethod(params MyType[] args) 
{ 
} 


MyMethod(myObject1, myObject2, myObject3); 

MyType[] a = { new MyType(), new MyType() }; 
MyMethod(a); 
1

不,你不能当作为参数传递给一个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关键字。在我的例子(和你的)中,你总是最终分开了ab。随着params你总是有一个数组来处理。

0

我有一个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 ["<access token>","Hello World!",true,3.1415]到我的服务器。

其实在实践中,我把moreObjects正确地写入JSON.Stringify,但你明白了。

所以你可以扩展数组,但是你必须传递一个数组作为唯一的params参数。在coffeescript中,你可以做PostJson(path, access_token, objects...),因为它有一个摔跤运营商...

如果您在C#试图PostJson(path, access_token, objects)你最终会发送JSON ["<access_token>",["Hello World!",true,3.1415]]

相关问题