Công cụ sửa đổi thông số params
cung cấp cho người gọi cú pháp phím tắt để chuyển nhiều đối số cho một phương thức.Có hai cách để gọi một phương thức với một tham số params
:
1) Calling với một mảng của các loại tham số, trong trường hợp từ khóa params
không có tác dụng và mảng được truyền trực tiếp đến phương pháp:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo(array);
2) Hoặc gọi với một danh sách dài các đối số, trong trường hợp trình biên dịch sẽ tự động quấn danh sách các đối số trong một mảng tạm thời và thông qua đó để phương pháp:
// Foo receives a temporary array containing the list of arguments.
Foo("1", "2");
// This is equivalent to:
object[] temp = new[] { "1", "2");
Foo(temp);
Để vượt qua trong một mảng đối tượng đến một phương pháp với một tham số "params object[]
", bạn có thể:
1) Tạo một mảng wrapper bằng tay và thông qua đó trực tiếp đến phương pháp, như đã đề cập bởi lassevk:
Foo(new object[] { array }); // Equivalent to calling convention 1.
2) Hoặc, đúc lập luận để object
, như đề cập bởi Adam, trong trường hợp trình biên dịch sẽ tạo ra các mảng wrapper cho bạn:
Foo((object)array); // Equivalent to calling convention 2.
Tuy nhiên, nếu mục tiêu của phương pháp này là để xử lý nhiều mảng đối tượng, nó có thể được dễ dàng hơn để khai báo với thông số "params object[][]
" rõ ràng. Điều này sẽ cho phép bạn để vượt qua nhiều mảng như các đối số:
void Foo(params object[][] arrays) {
foreach(object[] array in arrays) {
// process array
}
}
...
Foo(new[] { "1", "2" }, new[] { "3", "4" });
// Equivalent to:
object[][] arrays = new[] {
new[] { "1", "2" },
new[] { "3", "4" }
};
Foo(arrays);
Edit: Raymond Chen mô tả hành vi này và làm thế nào nó liên quan đến C# đặc điểm kỹ thuật trong a new post.
cách thông số hoạt động dường như không cần thiết và thiết kế C# tối ưu, cho những gì chúng tôi đã quen với các ngôn ngữ khác. params có thể đã được thực hiện để chỉ chấp nhận một hình thức, và một tính năng lây lan như có thể được thêm vào đó sẽ có lợi cho toàn bộ ngôn ngữ, không chỉ là trường hợp này. ví dụ, chúng ta có thể buộc tất cả các cuộc gọi param là Foo (obj [0], obj [1]), và sau đó có một toán tử spread riêng biệt cho phép Foo (... obj). – Lee
nhận ra tôi đã không nói rõ rằng tôi rất tôn trọng những người quản lý hejlsberg, ông là một trong những nhà thiết kế ngôn ngữ tốt nhất trên thế giới. nhưng chúng ta có thể suy nghĩ về những cải tiến đối với công việc của bất kỳ ai do đủ công nhận, do đó công nghệ. – Lee