Вопрос интерфейса C # - PullRequest
       16

Вопрос интерфейса C #

8 голосов
/ 27 февраля 2009

Сколько стоит передача объекта в функцию, которая реализует определенный интерфейс, где функция принимает только этот интерфейс? Как:

Change (IEnumerable<T> collection)

и я прохожу:

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

который все они реализуют IEnumerable. Но когда вы передаете какой-либо из них в метод Change, они приводятся к IEnumerable, что приводит к дополнительным затратам, но также к потере их уникальных методов и т. Д.?

Ответы [ 2 ]

14 голосов
/ 27 февраля 2009

Нет, актерский состав не задействован, поскольку List<T> IS-A IEnumerable<T>. Это использует полиморфизм, который не требует кастинга.

Редактировать: Вот пример:

using System;
using System.Collections.Generic;

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

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

IL для Main:

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

И, как вы можете видеть, здесь нет кастинга. Экземпляр List<T> помещается в стек, а их foo вызывается сразу после.

0 голосов
/ 27 февраля 2009

Я не верю, что есть цена. Поскольку типы уже реализуют IEnumerable, объект должен быть в состоянии использоваться сразу (обратите внимание, что это в основном предположение; я понятия не имею, как виртуальные таблицы CLR действительно работают за кулисами).

Если есть стоимость, она будет настолько удивительно мала, что, если она будет иметь значение, вам, вероятно, не стоит использовать CLR для начала.

...