Nach diese Frage würde ich gerne wissen, ob die Wiederverwendung von Lambda-Parameterausdruck-Instanzen sollten als gut oder schlecht betrachtet werden?
Manchmal erhalte ich einen vollständigen LINQ-Ausdrucksbaum, in dem die gleiche Lambda-Parameterinstanz lokal korrekt in einem zweiten, nichtnested Lambda verwendet wird:
%Vor%Somit ist die Deklaration der gleichen Lambda-Parameter-Instanz lparam sowohl für Lambda1 als auch für Lambda2 korrekt.
Es ist nur so, dass diese gemeinsame Lambda-Parameterinstanz die IQueryProvider-Implementierungen dazu zwingt, zusätzliche globale Bedeutung basierend auf der reinen Lambda-Parameterreferenz nicht zuzuordnen, da derselbe Parameter während der Verarbeitung eines anderen Lambda möglicherweise anders interpretiert werden muss. Außerdem erhalten Sie diese Art von Ausdrucksbaum (oder sollte ich sagen Graph?) Von LINQ nicht mit
%Vor%weil es für beide Lambda-Ausdrücke unterschiedliche Parameterinstanzen von (Person x) gibt. Das gleiche gilt für
%Vor%oder
%Vor%Es macht auch den Ausdrucksbaum eher zu einem Graphen.
Wird diese Art der Wiederverwendung von Parameterinstanzen als gut oder schlecht angesehen? Bis jetzt habe ich keine klare Antwort von den Behörden gefunden.
Ich würde kein Parameterobjekt zwischen zwei disjunkten Lambdas teilen.
Erstens, lassen Sie uns hier keine falschen Einsparungen erzielen. Objekte sind billig und Sie werden nicht hunderttausend davon machen. (Und wenn Sie sind, haben Sie wahrscheinlich größere Probleme zu lösen.)
Zweitens, wie Sie anmerken, bedeutet das Teilen referentiell identischer Parameterobjekte über nicht verwandte Lambdas, dass Code, der diese Lambda-Ausdrucksbäume analysiert, verstehen muss, dass das Parameterobjekt in verschiedenen Kontexten eine unterschiedliche Bedeutung hat. Das scheint ein Fehler zu sein, der darauf wartet, passiert zu werden.
Drittens stellt man sich vor, dass Sie vielleicht eines Tages zwei Expression-Bäume nehmen möchten:
%Vor%und von ihnen einen dritten bauen, sagen:
%Vor%Wenn x und y beide dasselbe Parameterobjekt sind, haben Sie ein Problem mit Ihren Händen:
%Vor%Auf der anderen Seite weist die Antwort von StriplingWarrior darauf hin, dass wenn Sie
haben %Vor%dann ist es einfacher, sie als
zu kombinieren %Vor%weil Sie dann nicht etwas neu schreiben müssen.
Im Grunde scheint es nur eine riskante Bewegung ohne wirklich zwingenden Vorteil, warum also?
Sie müssen Ihren Anwendungsfall berücksichtigen. Wie könnten diese Lambdas in Zukunft kombiniert werden?
Wollen Sie beispielsweise zwei Lambdas mit einer ODER-Verknüpfung kombinieren?
%Vor%Wenn ja, ist es einfacher, sie so zu verbinden:
%Vor% Der obige Code funktioniert gut, wenn beide das gleiche Parameterausdruck-Objekt haben. Ist dies nicht der Fall, müssen Sie plötzlich den gesamten Baum von lambda2
durchlaufen und einen neuen Ausdrucksbaum erstellen, der den Parameter des ersten Ausdrucks ersetzt. Es kann gemacht werden, und ich habe einige Hilfsmethoden geschrieben, um es einfach zu machen, wenn ich solche Sachen machen muss, aber wenn du erkennen kannst, dass dies der Fall ist, in dem du dich treffen wirst Machen Sie sich das Leben einfacher, indem Sie denselben Parameter verwenden.
Andererseits, wenn Sie die Lambdas so kombinieren wollen, dass die Parameter in einem größeren Lambda-Ausdruck unterschiedliche Rollen spielen müssen, wie Eric betont hat, dann werden Sie diese Parameter brauchen anders.