2009-02-27 45 views
8

Có chi phí khi chuyển đối tượng đến hàm thực hiện giao diện cụ thể mà chức năng chỉ chấp nhận giao diện đó không? Giống như:Câu hỏi giao diện C#

Change (IEnumerable<T> collection) 

và tôi vượt qua:

List<T> 
LinkedList<T> 
CustomCollection<T> 

đó tất cả trong số họ thực hiện IEnumerable. Nhưng khi bạn vượt qua bất kỳ của những người để thay đổi phương pháp, họ được đúc để IEnumerable, do đó có một chi phí diễn viên mà còn là vấn đề mất phương pháp duy nhất của họ, vv?

+0

+1 Câu hỏi rất thú vị! –

Trả lời

14

Không, không có dàn diễn viên nào tham gia kể từ List<T>IS-AIEnumerable<T>. Điều này là sử dụng đa hình mà không yêu cầu đúc.

Edit: Đây là một ví dụ:

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     foo(new List<int>()); 
    } 

    static void foo(IEnumerable<int> list) { } 
} 

Các IL cho Main là:

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: nop 
    L_0001: newobj instance void [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    L_0006: call void Program::foo(class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>) 
    L_000b: nop 
    L_000c: ret 
} 

Và như bạn có thể thấy không có đúc liên quan. Ví dụ của List<T> được đẩy lên ngăn xếp và chúng foo được gọi ngay sau đó.

+0

Cộng với đối tượng không "mất" phương thức của chúng, chúng không có sẵn bên trong hàm. Điều này là ok bởi vì phương pháp chỉ mong đợi IEnumerable và do đó chỉ nên sử dụng các phương thức có sẵn thông qua giao diện đó. – tvanfosson

0

Tôi không tin rằng có chi phí. Kể từ khi các loại đã thực hiện IEnumerable, đối tượng sẽ có thể được sử dụng ngay lập tức (lưu ý rằng đây là chủ yếu là một đoán; Tôi không có ý tưởng về cách vtables CLR thực sự làm việc đằng sau hậu trường).

Nếu có chi phí, nó sẽ quá nhỏ đến mức đáng kinh ngạc, nếu nó tạo sự khác biệt, có thể bạn không nên sử dụng CLR để bắt đầu.