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


Meghatalmazottak használata (C# programozási útmutató)

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 –Method1Method2 és DelegateMethod. Az eredeti három meghatalmazott d1d2d3vá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.Delegatevannak, 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);
}

Lásd még