Kiedy pisałem kilka metod rozszerzających dla moich obiektów logiki biznesowej, doszedłem do kwestii zmiany nazw metod konwersji. someObject.ToAnotherObject()
pasowałby dobrze z szeroko stosowanym object.ToString()
.
Jednak LINQ, na przykład, miesza oba warianty i nie mogę znaleźć między nimi różnicy. ToDictionary()
, ToList()
, AsParallel()
, AsQueryable()
, ...
Jakie są różnice między tymi dwiema konwencjami nazewnictwa i co powinienem wiedzieć, aby zdecydować, czy użyć dla własnych klas?
źródło
.AsCleanApple()
odkąd tylko trzeba go umyć, a.ToFruitSalad()
ponieważ mój nóż zmieni strukturę apple‽AsCleanApple
że zmieni coś w jabłku. Lepszą analogią mogłoby byćAsFruit
.AsCleanAppleSource()
zmieni coś, co było źródłem jabłek, w coś, co było źródłem czystych jabłek; dodanie etapu mycia, jeśli to konieczne, ale być może nie robiąc nic, jabłka były już znane jako czyste..ToPunnet()
uzyskałby dostęp do tego źródła i dałby ci punnet jabłek.W Linq
ToXXX
wszystkie metody wykonują zapytanie i tworzą nowy obiekt na podstawie wyników, podczas gdyAsXXX
metody generują nowe zapytanie, które jest w pewien sposób inne. Może to być ten sam obiekt, ale dostępne za pośrednictwem innego interfejsu (AsEnumerable()
robi to) lub może to być nowy obiekt, który zmienia funkcjonalność (inne sposoby to zrobić, choć niektórzy sprawdzić, czy może po prostu wrócić danego obiektu, npAsQueryable()
wola powrót,source
jeśliIQueryable<T>
już implementuje , lub wEnumerableQuery<TElement>
przeciwnym razie utwórz nowy ).źródło
that alters how the functionality
- Czy jesthow
niepotrzebne, czy też powinna być kolejna część oświadczenia?ToXXX()
wyświetla dane bez związku z oryginałem.AsXXX()
utrzymuje aktywny związek z oryginałem (przynajmniej w przykładach Enumerable / Queryable, które omawiamy).ToXXX execute the query
iAsXXX produce a new query
. Brzmi dobrze z tego, co przeczytałem w LINQ, a MSDN wydaje się potwierdzać ToXXX , ale zastanawiam się, czy ktoś ma źródło, czy wszystkieAsXXX
metody są odroczone?AsXXX
do tych właściwych dla Linq (np.AsParallel
dodany przez PLinq,AsNoTracking
dostarczony przez Entity Framework, i tak dalej). Z pewnością rdzeniem linq jest to, co jest zdefiniowane przezQueryable
iEnumerable
, a obie te klasy są zgodne z tą konwencją. Większość dodatków robi to do tego stopnia, że „wszystko” prawdopodobnie byłoby poprawne, ale jest zbyt otwarte, aby zagwarantować, że zawsze będzie poprawne (chociaż uważam, że każde uszkodzenie jest błędem projektowym).