Megosztás a következőn keresztül:


Kifejezésfák

A kifejezésfák egy faszerű adatstruktúrában lévő kódot jelölnek, ahol minden csomópont kifejezés, például metódushívás vagy bináris művelet, például x < y.

Ha a LINQ-t használta, tapasztalata van egy gazdag kódtárban, ahol a Func típusok az API-készlet részét képezik. (Ha nem ismeri a LINQ-t, érdemes elolvasnia a LINQ oktatóanyagot és a lambda kifejezésekről szóló cikket. A kifejezésfák gazdagabb interakciót biztosítanak a függvények argumentumaival.

LINQ-lekérdezések létrehozásakor függvényargumentumokat ír, általában Lambda-kifejezések használatával. Egy tipikus LINQ-lekérdezésben ezek a függvényargumentumok a fordító által létrehozott delegálttá alakulnak át.

Már írt olyan kódot, amely kifejezésfákat használ. Az Entity Framework LINQ API-jai a LINQ lekérdezési kifejezésmintájának argumentumaként elfogadják a kifejezésfákat. Ez lehetővé teszi, hogy az Entity Framework lefordítsa a C#-ban írt lekérdezést az adatbázismotorban végrehajtott SQL-be. Egy másik példa a Moq, amely a .NET népszerű szimulálási keretrendszere.

Ha részletesebb interakcióra van szüksége, kifejezésfákat kell használnia. A kifejezésfák a kódot vizsgálják, módosítják vagy végrehajtják. Ezek az eszközök lehetővé teszik a kód futásidejű manipulálását. Olyan kódot ír, amely megvizsgálja a futó algoritmusokat, vagy új képességeket injektál. Speciálisabb forgatókönyvekben módosítja a futó algoritmusokat, és akár C#-kifejezéseket is lefordít egy másik űrlapra egy másik környezetben való végrehajtáshoz.

A kifejezésfák által képviselt kód fordítása és futtatása. A kifejezésfák létrehozása és futtatása lehetővé teszi a végrehajtható kód dinamikus módosítását, a LINQ-lekérdezések végrehajtását különböző adatbázisokban, valamint dinamikus lekérdezések létrehozását. A LINQ kifejezésfáival kapcsolatos további információkért lásd: A kifejezésfák használata dinamikus lekérdezések létrehozásához.

A dinamikus nyelvi futtatókörnyezetben (DLR) kifejezésfákat is használnak a dinamikus nyelvek és a .NET közötti interoperabilitás biztosításához, és lehetővé teszik a fordítók számára, hogy kifejezésfákat bocsátanak ki a Microsoft köztes nyelve (CIL) helyett. A DLR-ről további információt a Dinamikus nyelvi futtatókörnyezet áttekintése című témakörben talál.

A C# vagy a Visual Basic fordító létrehozhat egy kifejezésfát egy névtelen lambda kifejezés alapján, vagy manuálisan is létrehozhat kifejezésfákat a System.Linq.Expressions névtér használatával.

Ha egy lambda kifejezés egy típusú Expression<TDelegate>változóhoz van rendelve, a fordító kódot bocsát ki a lambda kifejezést jelképező kifejezésfa létrehozásához.

Az alábbi példakód bemutatja, hogyan hozhat létre a C#-fordító egy olyan kifejezésfát, amely a lambda kifejezést num => num < 5jelöli.

Expression<Func<int, bool>> lambda = num => num < 5;

Kifejezésfákat hoz létre a kódban. A fát úgy hozhatja létre, hogy minden csomópontot létrehoz, és a csomópontokat egy faszerkezetbe csatolja. A kifejezésfák létrehozásáról szóló cikkben megismerheti, hogyan hozhat létre kifejezéseket.

A kifejezésfák nem módosíthatók. Ha módosítani szeretne egy kifejezésfát, új kifejezésfát kell létrehoznia a meglévő másolásával és a benne lévő csomópontok cseréjével. Egy kifejezésfa látogatója segítségével lépkedhet a meglévő kifejezésfán. További információkért tekintse meg a kifejezésfák fordításáról szóló cikket.

Miután létrehozott egy kifejezésfát, végrehajtja a kifejezésfa által képviselt kódot.

Korlátozások

A C#-fordító csak a lambdas (vagy egysoros lambda) kifejezésből hoz létre kifejezésfákat. Nem tudja elemezni a lambdas (vagy többsoros lambdas) utasítást. A C#-ban található lambdakifejezésekről további információt a Lambda-kifejezések című témakörben talál.

Vannak olyan újabb C#-nyelvi elemek, amelyek nem fordítják le jól a kifejezésfákat. A kifejezésfák nem tartalmazhatnak await kifejezéseket vagy async lambdakifejezéseket. A C# 6 és újabb verzióiban hozzáadott funkciók közül sok nem pontosan a kifejezésfákban írt módon jelenik meg. Ehelyett az újabb funkciók a kifejezésfákban jelennek meg az egyenértékű, korábbi szintaxisban, ahol lehetséges. Más szerkezetek nem érhetők el. Ez azt jelenti, hogy a kifejezésfákat értelmező kód ugyanúgy működik az új nyelvi funkciók bevezetésekor. A kifejezésfák azonban még ezekkel a korlátozásokkal is lehetővé teszik olyan dinamikus algoritmusok létrehozását, amelyek az adatstruktúraként megjelenített kód értelmezésére és módosítására támaszkodnak. Lehetővé teszi a gazdag kódtárak, például az Entity Framework számára, hogy végrehajtsa a feladatokat.

A kifejezésfák nem támogatják az új kifejezéscsomópontok típusait. Az új csomóponttípusok bevezetése jelentős változtatás lenne minden kifejezésfát értékelő könyvtár esetében. Az alábbi lista tartalmazza a legtöbb olyan C#-nyelvi elemet, amely nem használható: