Mientras escribía algunos métodos de extensión para mis objetos de lógica empresarial, me planteé la cuestión de cambiar el nombre de los métodos de conversión. someObject.ToAnotherObject()iría bien con el ampliamente utilizado object.ToString().
Sin embargo, LINQ, por ejemplo, mezcla ambas variantes y no puedo encontrar una diferencia entre ellas. ToDictionary(), ToList(), AsParallel(), AsQueryable(), ...
¿Cuáles son las diferencias entre estas dos convenciones de nomenclatura y qué debo saber para decidir si usarlo para mis propias clases?
fuente

.AsCleanApple()porque solo necesito lavarla, y.ToFruitSalad()porque mi cuchillo cambiaría la estructura de la manzana‽AsCleanAppleva a cambiar algo acerca de la manzana. Una mejor analogía podría serAsFruit.AsCleanAppleSource()convertiría algo que fuera una fuente de manzanas en algo que fuera una fuente de manzanas limpias; agregando un paso de lavado si es necesario, pero tal vez sin hacer nada si ya se sabía que las manzanas estaban limpias..ToPunnet()accedería a esa fuente y le daría una canasta de manzanas.En Linq,
ToXXXtodos los métodos ejecutan la consulta y crean un nuevo objeto a partir de los resultados, mientras que losAsXXXmétodos producen una nueva consulta que es diferente de alguna manera. Puede ser el mismo objeto pero al que se accede a través de una interfaz diferente (AsEnumerable()hace esto) o puede ser un objeto nuevo que altera la funcionalidad (los otros métodos hacen esto, aunque algunos verifican si pueden devolver el objeto dado, por ejemploAsQueryable(), volversourcesiIQueryable<T>ya se implementa , o crear una nueva enEnumerableQuery<TElement>caso contrario).fuente
that alters how the functionality- ¿Eshowinnecesario o debería haber una parte siguiente de la declaración?ToXXX()proyecta los datos sin relación con el original.AsXXX()mantiene una relación activa con el original (al menos en los ejemplos enumerables / consultables que estamos discutiendo).ToXXX execute the queryyAsXXX produce a new query. Suena bien por lo que he leído en LINQ, y MSDN parece confirmar para ToXXX , pero me pregunto si alguien tiene una fuente para saber si todos losAsXXXmétodos son ejecución diferida.AsXXXademás de los inherentes a Linq (por ejemplo, elAsParallelagregado por PLinq, elAsNoTrackingproporcionado por Entity Framework, y así). Ciertamente, el núcleo de linq es lo que se define porQueryableyEnumerable, y esas dos clases siguen esa convención. La mayoría de las adiciones lo hacen, en la medida en que "todas" probablemente sean correctas, pero es demasiado abierto para garantizar que siempre sea correcto (aunque yo consideraría cualquier ruptura como un defecto de diseño).