Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq Расширяемые методы дженерик / 2 сообщений из 2, страница 1 из 1
02.12.2013, 01:16
    #38485386
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq Расширяемые методы дженерик
Добрый день
Linq основан на расширяемых методах, все они имееют дженерик параметры. Во всех примерах что я видел, типы явно не указываются. Почему так? И если смысл в явном опеределениее типов дженерик параметров. Поясняю свой ворпос

Код: c#
1.
2.
var q=db.People.Select<People,string>(person=>person.Name);// явное определение типов дженерик
var q=db.People.Select(person=>person.Name); //без определения


Знаю что в дженерик коллекциях явное определение типов крайне важно для производительности и безопастности. Как обстоит дела в Расширяемых методах??
Спасибо
...
Рейтинг: 0 / 0
02.12.2013, 02:18
    #38485394
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq Расширяемые методы дженерик
Che0, компилятор понимает какие именно типы-аргументы имелись в виду. Метод Select имеет следующую сигнатуру:
Код: c#
1.
Enumerable.Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)


Ты вызываешь его для поля People которое является IEnumerable<People>. Следовательно тип-аргумент TSource это People. Лямбда возвращает строку. Значит TResult это string. Компилятор смог "угадать" типы без дополнительтных подсказок. Поэтому можно смело использовать сокращенный вызов:
Код: c#
1.
2.
// Вызов Enumerable.Select<People, string>(IEnumerable<People>, Func<People, string>)
var q=db.People.Select(person=>person.Name);


То есть в твоем примере обе строки ничем не отличаются по конечному результату компиляции.

Che0Знаю что в дженерик коллекциях явное определение типов крайне важно для производительности и безопастности.
Ты спутал несколько вещей - конструирование generic типа и его создание.

При конструировании объекта мы обязаны указать тип аргумент. Иначе компилятор не поймет какой тип нам нужен.

Вопрос производительности мы учитываем при создании generic типа. На этапе компиляции создается общая реализиция generic типа. Затем на этапе исполнения JIT-компилятор создает конкретные реализации. Для ссылочных типов реализация создается одна общая реализация. Для value типов создается своя собственная реализиция. Благодаря этому код и получается эффективным. Классический пример сравнение ArrayList и List<int>. Generic тип работает заметно быстрее из-за отсутствия упаковки/распаковки.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Linq Расширяемые методы дженерик / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]