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 meghatalmazott olyan típus, amely biztonságosan beágyaz egy metódust, hasonlóan a C és a C++ függvénymutatóhoz. A C függvénymutatókkal ellentétben a delegáltak objektumorientáltak, típusbiztosak és biztonságosak. Az alábbi példa deklarál egy elnevezett Callback
meghatalmazottat, amely beágyazhat egy olyan metódust, amely argumentumként használ egy sztringet , és érvénytelen értéket ad vissza:
public delegate void Callback(string message);
A delegált objektumokat általában a delegált burkoló metódus nevének megadásával vagy egy lambda kifejezéssel kell létrehozni. A meghatalmazott az ilyen módon történő példányosítás után hívható meg. A delegált meghívása meghívja a delegált példányhoz csatolt metódust. A hívó által a delegáltnak átadott paramétereket a rendszer átadja a metódusnak. A meghatalmazott visszaadja a metódus visszatérési értékét( ha van ilyen). Például:
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
// Instantiate the delegate.
Callback handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
A delegálttípusok a Delegate .NET osztályából származnak. A delegált típusok lezártak, nem származtathatók, és nem lehet egyéni osztályokat származtatni.Delegate Mivel a példányosított delegált egy objektum, argumentumként átadható, vagy hozzárendelhető egy tulajdonsághoz. Egy metódus elfogadhat egy meghatalmazottat paraméterként, és később meghívhatja a meghatalmazottat. Ezt aszinkron visszahívásnak nevezzük, és gyakori módszer a hívó értesítésére, ha egy hosszú folyamat befejeződik. Ha ilyen módon használ egy meghatalmazottat, a meghatalmazottat használó kódnak nincs szüksége a használt metódus implementálásának ismeretére. A funkció hasonló a beágyazási felületekhez.
A visszahívások másik gyakori használata az egyéni összehasonlító módszer definiálása és a delegált átadása egy rendezési módszernek. Lehetővé teszi, hogy a hívó kódja a rendezési algoritmus része legyen. Az alábbi példametódus a Del
típust használja paraméterként:
public static void MethodWithCallback(int param1, int param2, Callback callback)
{
callback("The number is: " + (param1 + param2).ToString());
}
Ezt követően az előző példában létrehozott meghatalmazottat átadhatja ennek a metódusnak:
MethodWithCallback(1, 2, handler);
És fogadja a következő kimenetet a konzolon:
The number is: 3
MethodWithCallback
nem kell közvetlenül meghívnia a konzolt – nem kell kifejezetten konzol céljára tervezni. Ez MethodWithCallback
azt jelenti, hogy előkészít egy sztringet, és átadja a sztringet egy másik metódusnak. A delegált metódusok tetszőleges számú paramétert használhatnak.
Amikor egy példánymetódus körbefuttatására hoz létre meghatalmazottat, a meghatalmazott a példányra és a metódusra is hivatkozik. A delegáltnak nincs ismerete az példány típusáról a burkoló metódus kivételével. A meghatalmazottak bármilyen típusú objektumra hivatkozhatnak, feltéve, hogy az objektumon van egy olyan metódus, amely megfelel a meghatalmazotti aláírásnak. Ha egy delegált statikus metódus burkolására van létrehozva, az csak a metódusra hivatkozik. Vegye figyelembe a következő deklarációkat:
public class MethodClass
{
public void Method1(string message) { }
public void Method2(string message) { }
}
A korábban bemutatott statikus DelegateMethod
mellett most már három metódussal is rendelkezünk, amelyeket egy Del
példányba csomagolhat.
A delegált meghívásakor több metódust is meghívhat, amit többszörös meghívásnak neveznek. Ha egy további metódust szeretne hozzáadni a meghatalmazott metóduslistájához – a meghívási listához –, egyszerűen két meghatalmazottat kell hozzáadnia az összeadási vagy összeadási hozzárendelési operátorokkal ('+' vagy '+='). Például:
var obj = new MethodClass();
Callback d1 = obj.Method1;
Callback d2 = obj.Method2;
Callback d3 = DelegateMethod;
//Both types of assignment are valid.
Callback allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;
A allMethodsDelegate
meghívási lista három metódust tartalmaz –Method1
Method2
és DelegateMethod
. Az eredeti három meghatalmazott d1
d2
d3
változatlan marad. Amikor a allMethodsDelegate
meghívódik, mindhárom metódus sorrendben kerül meghívásra. Ha a meghatalmazott referenciaparamétereket használ, a rendszer egymás után továbbítja a hivatkozást a három metódus mindegyikének, és az egyik metódus módosításai a következő metódus számára láthatók. Ha a metódusok bármelyike olyan kivételt ad ki, amely nem szerepel a metóduson belül, a rendszer átadja a kivételt a meghatalmazott hívójának. A meghívási listában nincsenek további metódusok meghívva. Ha a meghatalmazott visszatérési és/vagy kimenő paraméterekkel rendelkezik, akkor az utolsó meghívott metódus visszatérési értékét és paramétereit adja vissza. Ha el szeretne távolítani egy metódust a meghívási listából, használja a kivonási vagy kivonási hozzárendelési operátorokat (-
vagy -=
). Például:
//remove Method1
allMethodsDelegate -= d1;
// copy AllMethodsDelegate while removing d2
Callback oneMethodDelegate = (allMethodsDelegate - d2)!;
Mivel a delegálttípusok származtatva System.Delegate
vannak, az osztály által definiált metódusok és tulajdonságok meghívhatók a meghatalmazotton. Ha például meg szeretné keresni a metódusok számát a meghatalmazott meghívási listájában, a következőt írhatja:
int invocationCount = d1.GetInvocationList().GetLength(0);
Azok a delegátumok, amelyek meghívási listáján egynél több metódus van, a MulticastDelegate-ből származnak, amely a System.Delegate
alosztálya. Az előző kód mindkét esetben működik, mert mindkét osztály támogatja GetInvocationList
.
A multicast delegáltakat széles körben használják az eseménykezelésben. Az eseményforrás-objektumok eseményértesítéseket küldenek az esemény fogadásához regisztrált címzett objektumoknak. Az eseményre való regisztrációhoz a címzett létrehoz egy metódust, amelyet az esemény kezelésére terveztek, majd létrehoz egy delegáltat ehhez a metódushoz, és átadja a meghatalmazottat az esemény forrásának. Amikor az esemény bekövetkezik, a forrás meghívja a küldöttet. A delegál ezután meghívja az eseménykezelési függvényt a célobjektumon, és kézbesíti az eseményadatokat. Az eseményforrás határozza meg egy adott esemény delegálási típusát. További információ: Események.
A fordítási időpontban hozzárendelt két különböző típusú meghatalmazott összehasonlítása fordítási hibát eredményez. Ha a delegált példányok statikusan ilyen típusúak System.Delegate
, akkor az összehasonlítás engedélyezett, de futásidőben hamis értéket ad vissza. Például:
delegate void Callback1();
delegate void Callback2();
static void method(Callback1 d, Callback2 e, System.Delegate f)
{
// Compile-time error.
Console.WriteLine(d == e);
// OK at compile-time. False if the run-time type of f
// is not the same as that of d.
Console.WriteLine(d == f);
}