Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 < 5
jelö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ó:
- A kimenetből eltávolított feltételes metódusok
-
base
hozzáférés -
Metóduscsoport-kifejezések, beleértve a metóduscsoport címét (
&
) és a névtelen metóduskifejezéseket - Helyi függvényekre mutató hivatkozások
- Utasítások, beleértve a hozzárendelést (
=
) és az utasításként megfogalmazott kifejezéseket - Csak definiáló deklarációval rendelkező részleges metódusok
- Nem biztonságos mutatóműveletek
-
dynamic
Műveletek -
Összefoglaló operátorok
null
vagydefault
literállal a bal oldalon, nullösszekötő hozzárendelés és nulltovábbító operátor (?.
) - Többdimenziós tömb inicializálók, indexelt tulajdonságok és szótári inicializálók
- Gyűjteménykifejezések
-
throw
Kifejezések - Az
static virtual
vagyabstract
felület tagjainak elérése - Attribútumokkal rendelkező Lambda-kifejezések
- Interpolált sztringek
- UTF-8 sztringkonvertálások vagy UTF-8 sztringkonstansok
- Metódushívások változó argumentumokkal, elnevezett argumentumokkal vagy választható argumentumokkal
- "System.Index vagy System.Range használó
^
vagy indexelő kifejezések -
async
lambda kifejezések vagyawait
kifejezések, beleértveawait foreach
ésawait using
-
Tuple literálok, tuple konverziók, tuple
==
vagy!=
, vagywith
kifejezések -
Elveti (
_
), dekonstruálja a hozzárendelést, a mintaegyezőis
operátort vagy a mintaegyezőswitch
kifejezést - A COM-hívás
ref
az argumentumokkal kapcsolatban kihagyva -
ref
,in
vagyout
paraméterek,ref
visszaadja az értékeket,out
argumentumokat vagy bármilyen típusúref struct
értéket