Можно ли использовать дженерики C # для исключения вызовов виртуальных функций?

Я использую как C ++, так и C #, и я думал о том, можно ли использовать дженерики в C # для исключения вызовов виртуальных функций в интерфейсах. Примите во внимание следующее:

int Foo1(IList<int> list)
{
    int sum = 0;
    for(int i = 0; i < list.Count; ++i)
        sum += list[i];
    return sum;
}

int Foo2<T>(T list) where T : IList<int>
{
    int sum = 0;
    for(int i = 0; i < list.Count; ++i)
        sum += list[i];
    return sum;
}

/*...*/
var l = new List<int>();
Foo1(l);
Foo2(l);

Внутри Foo1 каждый доступ к list.Count и list [i] вызывает вызов виртуальной функции. Если бы это был C ++ с использованием шаблонов, то при вызове Foo2 компилятор мог бы увидеть, что вызов виртуальной функции может быть опущен и встроен, поскольку конкретный тип известен во время создания шаблона.

Но применимо ли то же самое к C # и дженерикам? Когда вы вызываете Foo2 (l), во время компиляции известно, что T является списком, и, следовательно, этот list.Count и list [i] не должны включать вызовы виртуальных функций. Прежде всего, будет ли это правильная оптимизация, которая ничего не сломает? И если да, то достаточно ли умен компилятор / JIT для такой оптимизации?

12
задан user773942 28 May 2011 в 01:58
поделиться