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‽AsCleanApple
va 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,
ToXXX
todos los métodos ejecutan la consulta y crean un nuevo objeto a partir de los resultados, mientras que losAsXXX
mé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()
, volversource
siIQueryable<T>
ya se implementa , o crear una nueva enEnumerableQuery<TElement>
caso contrario).fuente
that alters how the functionality
- ¿Eshow
innecesario 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 query
yAsXXX 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 losAsXXX
métodos son ejecución diferida.AsXXX
además de los inherentes a Linq (por ejemplo, elAsParallel
agregado por PLinq, elAsNoTracking
proporcionado por Entity Framework, y así). Ciertamente, el núcleo de linq es lo que se define porQueryable
yEnumerable
, 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).