2009-02-27 5 views
8

Y a-t-il un coût à passer un objet à une fonction qui implémente une interface particulière dans laquelle la fonction accepte uniquement cette interface? Comme:Question d'interface C#

Change (IEnumerable<T> collection) 

et je passe:

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

qui tous implémente IEnumerable. Mais lorsque vous passez un de ceux-ci à la méthode Change, sont-ils castés en IEnumerable, donc il y a un coût de cast mais aussi le problème de perdre leurs méthodes uniques, etc?

+0

+1 Question très intéressante! –

Répondre

14

Non, il n'y a pas de plâtre impliqué depuis List<T>IS-AIEnumerable<T>. Ceci utilise un polymorphisme qui ne nécessite pas de casting.

Edit: Voici un exemple:

using System; 
using System.Collections.Generic; 

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

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

L'IL pour Main est:

.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 
} 

Et comme vous pouvez le voir il n'y a pas coulée en cause. L'instance de List<T> est poussée sur la pile et les foo sont appelées immédiatement après.

+0

Plus les objets ne "perdent" pas leurs méthodes, ils ne sont tout simplement pas disponibles dans la fonction. C'est correct car la méthode attend uniquement IEnumerable et devrait donc utiliser uniquement les méthodes disponibles via cette interface. – tvanfosson

0

Je ne crois pas qu'il y ait un coût. Puisque les types implémentent déjà IEnumerable, l'objet devrait pouvoir être utilisé immédiatement (notez qu'il s'agit principalement d'une supposition, je n'ai aucune idée de la façon dont les vtables du CLR fonctionnent réellement dans les coulisses).

S'il y a un coût, ce sera si étonnamment petit que, si cela fait une différence, vous ne devriez probablement pas utiliser le CLR pour commencer.