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.
Az előző cikkben láthatta, hogy a delegate kulcsszóval létrehozhat meghatározott delegálttípusokat.
Az absztrakt delegálási osztály biztosítja a laza összekapcsoláshoz és meghíváshoz szükséges infrastruktúrát. A konkrét delegálási típusok sokkal hasznosabbá válnak azáltal, hogy a delegált objektum meghívási listájához hozzáadott metódusok típusbiztonságát átfogalmazják és érvényesítik. Amikor a kulcsszót delegate használja, és konkrét delegálási típust határoz meg, a fordító létrehozza ezeket a metódusokat.
A gyakorlatban ez új delegált típusok létrehozásához vezet, amikor más metódusaláírásra van szükség. Ez a munka egy idő után unalmas lehet. Minden új funkcióhoz új delegálási típusok szükségesek.
Szerencsére ez nem szükséges. A .NET Core-keretrendszer számos olyan típust tartalmaz, amelyeket bármikor újra felhasználhat, ha delegált típusokra van szüksége. Ezek általános definíciók, így deklarálhatja a testreszabásokat, ha új metódusdeklarációkra van szüksége.
Az első ilyen típus a Action típus, és számos változat:
public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.
Az in módosító az általános típus argumentumán a kovarianciáról szóló cikkben szerepel.
A delegált olyan változatai léteznek, amelyek legfeljebb 16 argumentumot tartalmaznak, mint például a Action.
Fontos, hogy ezek a definíciók különböző általános argumentumokat használjanak az egyes delegált argumentumokhoz: Ez maximális rugalmasságot biztosít. A metódusargumentumoknak nem kell azonosnak lenniük, hanem lehetnek.
Használjon egy Action típust minden olyan delegált típushoz, amely érvénytelen visszatérési típussal rendelkezik.
A keretrendszer számos általános delegálási típust is tartalmaz, amelyeket az értékeket visszaadó delegálástípusokhoz használhat:
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity
Az eredmény általános típusargumentumának módosítóját a kovarianciáról szóló cikk tárgyalja.
A delegáltaknak többféle változata van, legfeljebb 16 bemeneti argumentummal, például Func.
Az eredmény típusa mindig az utolsó típusparaméter az Func összes deklarációban konvenció szerint.
Használja az Func egyik típust minden olyan delegált típushoz, amely értéket ad vissza.
A meghatalmazottaknak van egy speciális Predicate<T> típusa is, amely egyetlen értéken ad vissza egy tesztet:
public delegate bool Predicate<in T>(T obj);
Megfigyelheti, hogy bármely Predicate típus esetében létezik szerkezetileg egyenértékű Func típus, például:
Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;
Azt gondolhatja, hogy ez a két típus egyenértékű. Nem így van. Ez a két változó nem használható felcserélhetően. Az egyik típusú változó nem rendelhető hozzá a másik típushoz. A C#-típusrendszer a definiált típusok nevét használja, nem a struktúrát.
A .NET Core-kódtár összes delegálttípus-definíciójának azt kell jelentenie, hogy nem kell új delegálástípust meghatároznia a létrehozott új, delegáltakat igénylő funkciókhoz. Ezeknek az általános definícióknak minden olyan delegálttípust meg kell adniuk, amelyekre a legtöbb helyzetben szüksége van. Egyszerűen példányosíthat egy ilyen típust a szükséges típusparaméterekkel. Általánossá tehető algoritmusok esetén ezek a meghatalmazottak általános típusként használhatók.
Ez időt takarít meg, és minimalizálja az új típusok számát, amelyeket létre kell hoznia a delegáltak használatához.
A következő cikkben számos gyakori mintát láthat a meghatalmazottakkal való munkavégzéshez a gyakorlatban.