2009-02-27 20 views
8

¿Hay un costo al pasar un objeto a una función que implementa una interfaz particular donde la función solo acepta esa interfaz? Al igual que:Pregunta de interfaz C#

Change (IEnumerable<T> collection) 

y paso:

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

la que todos ellos implementa IEnumerable. Pero cuando pasas cualquiera de ellos al método Change, ¿se los lanza a IEnumerable, por lo tanto, hay un costo de conversión pero también la cuestión de perder sus métodos únicos, etc.?

+0

+1 ¡Pregunta muy interesante! –

Respuesta

14

No, no hay ningún molde involucrado desde List<T>IS-AIEnumerable<T>. Esto está usando un polimorfismo que no requiere moldeo.

Editar: Aquí está un ejemplo:

using System; 
using System.Collections.Generic; 

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

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

La IL para Main es:

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

Y como se puede ver no hay fundición involucrados. La instancia de List<T> se inserta en la pila y se llama inmediatamente después de foo.

+0

Además, los objetos no "pierden" sus métodos, simplemente no están disponibles dentro de la función. Esto está bien porque el método solo espera IEnumerable y solo debería usar los métodos disponibles a través de esa interfaz. – tvanfosson

0

No creo que haya un costo. Como los tipos ya implementan IEnumerable, el objeto debería poder usarse de inmediato (tenga en cuenta que esto es principalmente una suposición, no tengo idea de cómo los vtables del CLR realmente funcionan detrás de escena).

Si hay un costo, será tan increíblemente pequeño que, si hace una diferencia, probablemente no debería usar el CLR para empezar.