Я использую как 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 для такой оптимизации?