Sdílet prostřednictvím


Delegáti s pojmenovanými vs. anonymními metodami (Průvodce programováním v C#)

A delegáta může být spojena s pojmenovanou metodu.Když konkretizujete delegát pojmenovanou metodu, metoda například předán jako parametr:

// Declare a delegate: 
delegate void Del(int x);

// Define a named method: 
void DoWork(int k) { /* ... */ }

// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;

To se nazývá pojmenované metodou.Delegáti s pojmenovanou metodu můžete zapouzdřit buď statické metoda nebo metody instance.Pojmenované metody jsou jediným způsobem, jak vytvořit instanci delegát v dřívějších verzích jazyka C#.Však v situaci, kdy vytvoření nové metody nežádoucí režie, C# umožňuje vytvořit instanci delegáta a ihned určit blok kódu, který bude zpracovávat delegát, když je zavolána.Blok může obsahovat lambda výraz nebo anonymní metody.Další informace naleznete v tématu Anonymní funkce (Průvodce programováním v C#).

Poznámky

Metoda, která předat jako parametr delegáta musí mít stejný podpis jako delegát prohlášení.

Instance delegát může zapouzdřit statických nebo metoda instance.

Ačkoli bude delegát moci použít mimo parametr, nedoporučujeme použití vícesměrového vysílání událostí delegáty protože nemůžete vědět delegáta, která bude volána.

Příklad 1

Následuje jednoduchý příklad deklarování a pomocí delegáta.Všimněte si, že obě delegáta, Dela související metody MultiplyNumbers, mají stejný podpis

// Declare a delegate 
delegate void Del(int i, double j);

class MathClass
{
    static void Main()
    {
        MathClass m = new MathClass();

        // Delegate instantiation using "MultiplyNumbers"
        Del d = m.MultiplyNumbers;

        // Invoke the delegate object.
        System.Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
        for (int i = 1; i <= 5; i++)
        {
            d(i, 2);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    // Declare the associated method. 
    void MultiplyNumbers(int m, double n)
    {
        System.Console.Write(m * n + " ");
    }
}
/* Output:
    Invoking the delegate using 'MultiplyNumbers':
    2 4 6 8 10
*/

Příklad 2

V následujícím příkladu je jeden delegát mapována na statické a instance metody a vrátí z každé specifické informace.

// Declare a delegate 
delegate void Del();

class SampleClass
{
    public void InstanceMethod()
    {
        System.Console.WriteLine("A message from the instance method.");
    }

    static public void StaticMethod()
    {
        System.Console.WriteLine("A message from the static method.");
    }
}

class TestSampleClass
{
    static void Main()
    {
        SampleClass sc = new SampleClass();

        // Map the delegate to the instance method:
        Del d = sc.InstanceMethod;
        d();

        // Map to the static method:
        d = SampleClass.StaticMethod;
        d();
    }
}
/* Output:
    A message from the instance method.
    A message from the static method.
*/

Viz také

Úkoly

Postupy: Kombinování delegátů (vícesměroví delegáti) (Průvodce programováním v C#)

Referenční dokumentace

Delegáti (Průvodce programováním v C#)

Anonymní metody (Průvodce programováním v C#)

Události (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#