Erősen beírt meghatalmazottak
Az előző cikkben láthatta, hogy a kulcsszó használatával delegate
meghatározott delegálttípusokat hoz létre.
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.
Ez a gyakorlatban új delegálttípusok létrehozásához vezet, amikor más metódusadákra 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
általános típusargumentum módosítójára a kovarianciáról szóló cikk foglalkozik.
A delegáltnak Action
legfeljebb 16 argumentuma van, például Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>.
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 out
eredmény általános típusargumentumának módosítójára a kovarianciáról szóló cikk foglalkozik.
A delegáltnak Func
legfeljebb 16 bemeneti argumentuma van, például Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>.
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ű. Ez azonban 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 meghatalmazottak használatához.
A következő cikkben számos gyakori mintát láthat a meghatalmazottakkal való munkavégzéshez a gyakorlatban.