2012-04-23 9 views
6

Giả sử tôi đã là một phương pháp chung chung như:Làm thế nào các phương thức chung được khởi tạo trong C#?

void Fun<T>(FunArg arg) {} 

Are this.Fun<Feature>this.Fun<Category> instantiations khác nhau của phương pháp chung chung?

Nói chung, phương pháp chung được khởi tạo như thế nào? Đối số chung khác nhau tạo ra phương thức khác nhau hoặc cùng một phương thức cùng với siêu dữ liệu khác nhau được sử dụng trong thời gian chạy?

Vui lòng hỗ trợ câu trả lời của bạn với một số trích dẫn từ đặc tả ngôn ngữ.

Ngoài ra, giả sử tôi đã làm những:

client.SomeEvent += this.Fun<Feature>; //line1 
client.SomeEvent += this.Fun<Category>; //line2 
client.SomeEvent += this.Fun<Result>; //line3 

rồi sau này,

client.SomeEvent -= this.Fun<Feature>; //lineX 

Liệu lineX undo điều mà tôi đã làm tại line1? Hoặc nó phụ thuộc vào cái gì khác cũng?

+0

Đó không phải là mã hợp lệ để bắt đầu. Bạn không thể sử dụng chuyển đổi nhóm phương thức làm đích của khai báo 'var'. Hiện tại mã hợp lệ và chúng tôi có thể đưa ra câu trả lời tốt hơn. –

+0

@JonSkeet: Đã xóa phần đó. – Nawaz

+0

Vì vậy, vào thời điểm này, ý nghĩa của * chính xác là gì? Bạn càng rõ ràng trong câu hỏi của bạn, câu trả lời của bạn càng rõ ràng. –

Trả lời

4

Tùy thuộc vào loại có liên quan.

Đối với tất cả các loại tài liệu tham khảo (ví dụ. lớp), một phương pháp sẽ được JITted để xử lý tất cả.

Đối với tất cả các loại giá trị (ví dụ. struct), một phương pháp mỗi loại sẽ được JITted.

Vì vậy, thông tin trong câu hỏi không đủ chi tiết để trả lời, nếu FeatureCategory là các loại tham chiếu, thì có, một phương pháp sẽ được JITted cho chúng. Nếu một trong số chúng, hoặc cả hai, là các kiểu giá trị, thì một phương thức cho mỗi loại giá trị sẽ được JITted.

Lưu ý việc sử dụng từ JITted tại đây. Trong assembly được biên dịch, sẽ chỉ có một phương thức, nhưng tại thời gian chạy, JITter sẽ tạo ra các triển khai thực tế của các phương thức chung theo các quy tắc trên.

Câu hỏi bật lên: Điều gì sẽ xảy ra nếu bạn sử dụng NGEN trên một bản lắp ráp với các loại/phương pháp chung? (Gợi ý: not what you think)

0

Có, chúng sẽ trở thành hai phương pháp riêng biệt.

+1

Bạn có bất kỳ nguồn nào cho điều này không? –

+0

Điều này có hữu ích không? http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx –

+0

Tôi có thể phải xóa câu trả lời này bằng cách này, bởi vì tôi đã không nhìn quá gần vào câu hỏi. –

5

Tất cả họ đều chia sẻ một định nghĩa phương pháp , nhưng khi chạy chúng khác nhau MethodInfo - bởi vì các đối số kiểu generic xác định một phương pháp chung.

Hỗ trợ minh họa:

Action<FunArg> a1 = Fun<X>; 
    Action<FunArg> a2 = Fun<Y>; 
    Action<FunArg> a3 = Fun<Y>; 
    Console.WriteLine(a1.Method == a2.Method); // false 
    Console.WriteLine(a3.Method == a2.Method); // true 

Ở cấp JIT, đó là phức tạp hơn; bất kỳ tham số kiểu tham chiếu nào sẽ chia sẻ một triển khai, làm tham chiếu là tham chiếu là một tham chiếu (lưu ý rằng tất cả T phải đáp ứng mọi hạn chế trước).Nếu có giá trị loại T, thì mọi kết hợp của các đối số loại chung sẽ có một triển khai riêng biệt trong thời gian chạy, vì mỗi yêu cầu thực hiện cuối cùng khác nhau.

+0

Nó không đơn giản ở cấp độ IL, nhưng phức tạp ở mức bản địa (JIT biên dịch)? –

+0

@Jon - thực sự; phải yêu mã op "bị ràng buộc"; Tôi đã sử dụng cụm từ sai ... –

+0

Tôi đã cập nhật câu hỏi của mình với nhiều truy vấn hơn. Xin vui lòng đó là tốt :-) – Nawaz