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


Erősen beírt meghatalmazottak

Előző

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.

Következő