Als ich einige Erweiterungsmethoden für meine Geschäftslogikobjekte schrieb, kam ich zu der Frage, die Konvertierungsmethoden umzubenennen. someObject.ToAnotherObject()
würde gut mit dem weit verbreiteten gehen object.ToString()
.
Allerdings verwechselt LINQ zum Beispiel beide Varianten und ich kann keinen Unterschied zwischen ihnen feststellen. ToDictionary()
, ToList()
, AsParallel()
, AsQueryable()
, ...
Was sind die Unterschiede zwischen diesen beiden Namenskonventionen und was sollte ich wissen, um zu entscheiden, ob ich sie für meine eigenen Klassen verwenden möchte?
quelle
.AsCleanApple()
da ich ihn nur waschen muss und.ToFruitSalad()
weil mein Messer die Struktur des Apfels verändern würdeAsCleanApple
wird ändern etwas über den Apfel. Eine bessere Analogie könnte seinAsFruit
.AsCleanAppleSource()
würde etwas, das eine Quelle für Äpfel war, in etwas verwandeln, das eine Quelle für saubere Äpfel war; Wenn nötig, einen Waschschritt hinzufügen, aber vielleicht nichts tun, waren die Äpfel bereits als sauber bekannt..ToPunnet()
würde auf diese Quelle zugreifen und Ihnen ein Körbchen Äpfel geben.In Linq führen
ToXXX
alle Methoden die Abfrage aus und erstellen aus den Ergebnissen ein neues Objekt, während dieAsXXX
Methoden eine neue Abfrage erstellen, die sich in irgendeiner Weise unterscheidet. Es kann das gleiche Objekt, sondern durch eine andere Schnittstelle zugegriffen wird (AsEnumerable()
tut dies) oder es kann ein neues Objekt sein , dass Abspaltungen die Funktionalität (die anderen Methoden , um dies zu tun, auch wenn einige überprüfen, ob sie nur das angegebene Objekt zurückgeben, zBAsQueryable()
werden zurückgeben,source
wenn esIQueryable<T>
bereits implementiert ist , oderEnumerableQuery<TElement>
andernfalls ein neues erstellen ).quelle
that alters how the functionality
- Ist dashow
unnötig oder sollte es einen nächsten Teil der Erklärung geben?ToXXX()
projiziert die Daten ohne Beziehung zum Original.AsXXX()
behält eine aktive Beziehung zum Original bei (zumindest in den Beispielen für Aufzählung / Abfrage, die wir diskutieren).ToXXX execute the query
undAsXXX produce a new query
. Klingt richtig nach dem, was ich auf LINQ gelesen habe, und MSDN scheint für ToXXX zu bestätigen , aber ich frage mich, ob jemand eine Quelle dafür hat, ob alleAsXXX
Methoden verzögert ausgeführt werden?AsXXX
zu den Linq- Anbietern einen neuen hinzufügt (z. B. denAsParallel
von PLinq hinzugefügten, denAsNoTracking
von Entity Framework bereitgestellten). und so weiter). Sicherlich ist der Kern von linq das, was durchQueryable
und definiert istEnumerable
, und diese beiden Klassen folgen beide dieser Konvention. Die meisten Ergänzungen tun dies in dem Maße, in dem "alles" wahrscheinlich korrekt wäre, aber es ist zu offen, um garantiert immer korrekt zu sein (obwohl ich jeden Bruch als Konstruktionsfehler betrachten würde).