Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Так, там своего рода увеличение производительности, которое будет иметься от изменения Списка к var
No, но это не единственная допустимая причина рефакторинга. Что еще более важно, это удаляет дублирование и делает код короче без любой потери в ясности.
мне всегда преподавали, что явно определение переменной, вместо того, чтобы использовать динамическое, более оптимально.
Вы неправильно понимаете что var
средства. Это не всегда динамично, так как это производит тот же вывод. Это просто означает, что компилятор изображает тип для переменной отдельно. Это очевидно способно к выполнению так, так как это - тот же механизм, используемый для тестирования на безопасность типов и правильность.
Это также удаляет абсолютно бесполезное дублирование кода. Для простых типов это не могло бы быть очень. Но рассмотрите:
SomeNamespace.AndSomeVeryLongTypeName foo = new SomeNamespace.AndSomeVeryLongTypeName();
Очевидно, в этом случае, удваивающем имя, не является просто ненужным, но и на самом деле вредным.
var
ключевое слово на самом деле не объявляет переменную с динамическим типом. Переменная все еще со статическим контролем типов, она просто выводит тип из контекста.
хороший ярлык, когда у Вас есть долгое имя типа (универсальные имена типов могут быть долгими)
Меньше ввода = больше производительности :)
Нет. Они испускают точно тот же самый IL.
Это - просто вопрос стиля.
var
обладает преимуществом, которое помогает Вам изменить тип возврата функций, не изменяя другие части исходного кода. Например, измените тип возврата с IEnumerable<T>
до List<T>
. Однако это могло бы помочь представить ошибки.