2012-01-03 31 views
12

Tôi nhớ rằng tôi có màu đỏ ở đâu đó mà bạn có thể tạo một phương thức lấy đối số vô tận. Vấn đề là tôi không nhớ làm thế nào để làm điều đó. Tôi nhớ rằng đó là một cái gì đó như thế này:Đối số phương pháp vô tận cùng loại

private void method(int arguments...) 
{ 
//method body 
} 

Tôi chắc chắn rằng có "...". Và tôi nhớ rằng khi bạn gọi method, bạn có thể gọi nó như sau: method(3232); hoặc method(123,23,12); Nếu có ai hiểu về những gì tôi đang nói, vui lòng cho tôi biết cách thực hiện.

Trả lời

42

Bạn sẽ sử dụng params keyword:

private void method(params int[] arguments) 
{ 
    //method body 
} 

Bạn có thể gọi phương thức của bạn như vậy: method(1,2,3,4,5,6,7,8,9); và mảng sẽ chứa các số đó. Từ khóa params phải nằm trên một mảng, và nếu nó không phải là tham số duy nhất trong phương thức, nó phải là giá trị cuối cùng. Chỉ có một tham số có thể có khai báo param.

+0

OK nhưng tại sao tôi lại nhớ việc sử dụng ...? – Bosak

+8

@Bosak: Đó là cách nó được thực hiện trong Java (mặc dù '...' xuất hiện sau tên kiểu). –

+0

Ồ bạn có thể đúng. Tôi không biết Java nhưng tôi đã từng xem một clip về một cái gì đó trong Java và vì nó rất giống C# Tôi nhầm lẫn nó. – Bosak

3

bạn có nghĩa là ParamArray ? (đối với vb.net)

cho C# nó có vẻ nó params

+3

Đó là VB; câu hỏi được gắn thẻ C#. – phoog

+0

@phoog, được chú ý và bổ sung cho C# – Fredou

1

Bạn đang tìm định nghĩa c/C++ về số lượng đối số vô hạn cho hàm. Bạn có thể xem tại đây - http://www.cplusplus.com/reference/cstdarg/va_start/

Một cách dễ dàng để thực hiện một chức năng như vậy là như thế:

1- xác định chức năng của bạn ví dụ

void logging(const char *_string, int numArgs, ...) 

tranh luận đầu tiên là chuỗi bạn muốn sử dụng .

Đối số thứ hai là số đối số vô hạn mà bạn muốn cung cấp. Bạn không cần phải sử dụng tham số này, nếu bạn muốn đếm phần giữ chỗ trong một công tắc (như% d,% f trong printf) -Hint: trong một vòng lặp nhận được mọi char và xem nếu nó là trình giữ chỗ của bạn-.

tôi muốn cung cấp đầu tiên một ví dụ làm thế nào bạn có thể gọi một chức năng như:

logging("Hello %0. %1 %2 %3", "world", "nice", "to", "meet you"); // infinite arguments are "world", "nice", ... you can give as much as you want 

Như bạn thấy placeholders của tôi là những con số. Bạn có thể sử dụng bất cứ điều gì bạn muốn.

2- Có macro, khởi tạo biến danh sách và nhận được giá trị của một cuộc tranh cãi:

va_list arguments; // define the list 
va_start(arguments, numArgs); // initialize it, Note: second argument is the last parameter in function, here numArgs 

for (int x = 0; x < numArgs; x++) // in a loop 
{ 
     // Note : va_arg(..) gets an element from the stack once, dont call it twice, or else you will get the next argument-value from the stack 
     char *msg = va_arg(arguments, char *); // get "infinite argument"-value Note: Second parameter is the type of the "infinite argument". 
     ... // Now you can do whatever you want - for example : search "%0" in the string and replace with msg 
} 
va_end (arguments); // we must end the listing 

Nếu bạn thay thế từng giữ chỗ với các giá trị tham số vô hạn và in ra chuỗi mới, bạn sẽ thấy điều này :

Xin chào mọi người. nice to meet you

Tôi hy vọng rằng sẽ giúp ...

+1

[Vui lòng cung cấp nhiều hơn một liên kết làm câu trả lời] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – ThreeFx

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