2010-01-30 56 views
5

Hãy nói rằng tôi có thể tạo hai phương pháp:C#: Chữ ký phương thức?

public void AddScriptToPage(params string[] scripts) { /*...*/ } 
public void AddScriptToPage(string href, string elementId) { /*...*/ } 

Mà một trong những phương pháp được gọi bởi mã dưới đây, và tại sao?

AddScriptToPage("dork.js", "foobar.js"); 

Trình biên dịch xác định phương thức cần gọi?

Trả lời

8

Phương pháp thứ hai của bạn được gọi, nếu tìm thấy kết hợp chính xác, nó được sử dụng trước thông số.

From MSDN:

Khi thực hiện giải quyết tình trạng quá tải, một phương pháp với một mảng tham số có thể được áp dụng một trong hai hình thức bình thường của nó hoặc dưới hình thức mở rộng của nó (mục 7.4.2.1). Dạng mở rộng của một phương thức chỉ có sẵn nếu hình thức bình thường của phương thức này không áp dụng được và chỉ khi một phương thức có cùng chữ ký với dạng mở rộng chưa được khai báo trong cùng một kiểu.

dụ của họ:

using System; 
class Test 
{ 
    static void F(params object[] a) { 
     Console.WriteLine("F(object[])"); 
    } 
    static void F() { 
     Console.WriteLine("F()"); 
    } 
    static void F(object a0, object a1) { 
     Console.WriteLine("F(object,object)"); 
    } 
    static void Main() { 
     F(); 
     F(1); 
     F(1, 2); 
     F(1, 2, 3); 
     F(1, 2, 3, 4); 
    } 
} 

Output:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
+0

Điều này đặc biệt khó hiểu đối với mọi người khi họ gọi F (null). Bạn có nhận được F ((object []) null) hay F (đối tượng mới [] {null})? Nhiều người mong đợi sau này, nhưng kể từ khi cựu được áp dụng ở dạng bình thường, nó là tốt hơn. –

+0

@Eric - Bạn không bao giờ ngừng ngạc nhiên với tôi với một câu hỏi khung sâu/thực tế tôi không bao giờ nghĩ đến ... nhưng cuối cùng sử dụng trong các tháng thực hành sau đó. Một số câu trả lời của bạn ở đây đã tạo ra những khác biệt hiệu suất to lớn đối với tôi, hãy giữ nó lên. –

+0

Dọc theo dòng nhận xét của bạn, nếu bạn chưa đọc đặc tả chú thích được xuất bản bởi Microsoft, bạn thực sự nên; nó là một mỏ vàng. – jason

5
public void AddScriptToPage(string href, string elementId) 

.. sẽ được gọi. Trình biên dịch chọn chữ ký có kết quả chính xác nhất, với các tham số có mức độ ưu tiên thấp nhất.

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