Когда я писал некоторые методы расширения для своих объектов бизнес-логики, я пришел к вопросу о переименовании методов преобразования. someObject.ToAnotherObject()
отлично подошли бы к широко используемым object.ToString()
.
Однако LINQ, например, смешивает оба варианта, и я не могу найти между ними разницы. ToDictionary()
, ToList()
, AsParallel()
, AsQueryable()
, ...
В чем разница между этими двумя соглашениями об именах и что мне нужно знать, чтобы решить, использовать ли их для моих собственных классов?
источник
.AsCleanApple()
так как мне нужно только его помыть, и.ToFruitSalad()
потому что мой нож изменил бы структуру яблока‽AsCleanApple
то изменится в яблоке. Лучшая аналогияAsFruit
.AsCleanAppleSource()
превратит то, что было источником яблок, в то, что было источником чистых яблок; добавляя этап промывки, если необходимо, но, возможно, ничего не делая, если яблоки уже известны как чистые..ToPunnet()
получит доступ к этому источнику и даст вам корзину яблок.В Linq
ToXXX
все методы выполняют запрос и создают новый объект из результатов, в то время какAsXXX
методы создают новый запрос, который в чем-то отличается. Это может быть тот же объект, но доступ к нему осуществляется через другой интерфейс (AsEnumerable()
делает это), или это может быть новый объект, который изменяет функциональность (другие методы делают это, хотя некоторые проверяют, могут ли они просто вернуть данный объект, например,AsQueryable()
будут вернуть,source
если онIQueryable<T>
уже реализован , или создать новый вEnumerableQuery<TElement>
противном случае).источник
that alters how the functionality
-how
Ненужно или должна быть следующая часть заявления?ToXXX()
проецирует данные без отношения к оригиналу.AsXXX()
поддерживает активное отношение к оригиналу (по крайней мере, в обсуждаемых нами примерах Enumerable / Queryable).ToXXX execute the query
иAsXXX produce a new query
. Звучит правильно из того, что я читал о LINQ, и MSDN, похоже, подтверждает ToXXX , но мне интересно, есть ли у кого-нибудь источник, все лиAsXXX
методы являются отложенным выполнением?AsXXX
поверх тех, которые присущи Linq (например,AsParallel
добавленный PLinq,AsNoTracking
предоставленный Entity Framework, и так далее). Конечно, ядро linq - это то, что определяетсяQueryable
иEnumerable
, и оба этих класса следуют этому соглашению. Большинство дополнений делают это до такой степени, что "все", вероятно, будет правильным, но оно слишком открыто, чтобы гарантировать, что всегда будет правильным (хотя я считаю любое нарушение недостатком дизайна).