2009-10-31 36 views
5

Trong ruby ​​bạn có thể làm một cái gì đó như thế này:Bạn có thể chuyển mảng 'mở rộng' sang một hàm trong C# như trong ruby ​​không?

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

Vì vậy, nếu myArray có 2 mục, nó sẽ tương đương với việc này:

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

Vì vậy mà trong cơ thể phương pháp, một == myArray [0] và b == myArray [1]

Bạn có thể làm điều này trong C# không? (Vì vậy, tôi có thể có một phương thức được khai báo với các đối số rõ ràng, thay vì chỉ lấy một mảng làm đối số)

EDIT: Tôi nên cụ thể hơn về phương thức được gọi.

Trả lời

9

phương pháp của bạn có thể được khai báo để chấp nhận một mảng tham số, qua params:

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

Bây giờ bạn có thể vượt qua một tùy ý số của int s cho phương pháp hoặc một mảng int. Nhưng với tuyên bố phương thức cố định, bạn không thể mở rộng một mảng khi bạn có thể sử dụng trong Ruby, vì các thông số được xử lý khác nhau theo mui xe (tôi tin điều này khác với Ruby) và vì C# không khá năng động.

Về mặt lý thuyết, bạn có thể sử dụng sự phản chiếu để gọi phương thức để đạt được cùng một hiệu ứng, mặc dù (gọi phương thức phản ánh luôn chấp nhận một mảng tham số).

+0

tôi có thể phải kết thúc bằng cách sử dụng điều phản ánh để làm cho nó làm việc theo cách tôi muốn, nhưng điều này là thú vị. Cảm ơn! –

6

Nếu bạn khai báo đối số của hàm bằng từ khóa params, bạn có thể chuyển một mảng hoặc một số tùy ý các thông số riêng lẻ.

Ví dụ:

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); 
     } 
    } 
} 

sản xuất

1 
2 
3 
10 
11 
12 
0

Bạn có thể làm điều này:

void MyMethod(params MyType[] args) 
{ 
} 


MyMethod(myObject1, myObject2, myObject3); 

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

Không, bạn không thể có mảng "tự động mở rộng" khi thông qua như là một cuộc tranh cãi đến một phương pháp C#. Một cách để mô phỏng phương pháp này được viết quá tải:

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 
} 

Nhưng khi một vài người khác đã đề cập, nó là đơn giản hơn (và có phần ngược lại) để sử dụng các từ khóa params. Trong ví dụ của tôi (và của bạn), bạn luôn luôn có riêng ab. Với params bạn luôn có một mảng để giải quyết.

0

Tôi có phương thức PostServer(string path, params object[] objects) đăng bài json lên máy chủ của tôi. Nhưng trước khi tôi gửi mảng đối tượng của mình, tôi thêm một mã thông báo phiên vào mặt trước của nó.

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 
} 

Sau đó ... PostServer("/greet", "Hello World!", true, 3.1415);

sẽ gửi json ["<access token>","Hello World!",true,3.1415] vào máy chủ của tôi.

Thực tế trong thực tế, tôi đặt moreObjects ngay vào JSON.Stringify nhưng bạn nhận được điểm.

Vì vậy, bạn có thể mở rộng mảng, nhưng bạn đã vượt qua một mảng làm tham số params duy nhất. Trong coffeescript bạn có thể làm PostJson(path, access_token, objects...), bởi vì nó có một nhà điều hành splat ....

Nếu bạn đã cố gắng PostJson(path, access_token, objects) trong C# bạn sẽ kết thúc gửi json ["<access_token>",["Hello World!",true,3.1415]]

Các vấn đề liên quan