Adlandırılmış ve Anonim Metotlarla Temsilciler (C# Programlama Kılavuzu)

Bir temsilci belirli bir yöntemle ilişkilendirilebilir. Adlandırılmış bir yöntem kullanarak bir temsilci örneği oluşturduğunuzda, yöntem parametre olarak geçirilir, örneğin:

// Declare a delegate.
delegate void WorkCallback(int x);

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

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

Yukarıdaki örnekte adlandırılmış bir yöntem kullanılır. Adlandırılmış bir yöntemle inşa edilen temsilciler statik bir yöntem veya bir örnek yöntemi kapsülleyebilir. Adlandırılmış yöntemler, önceki C# sürümlerinde temsilci örneği oluşturmanın tek yoludur. C# bir temsilci örneği oluşturmanıza ve temsilcinin çağrıldığında işlediği bir kod bloğunu hemen belirtmenize olanak tanır. Blok, aşağıdaki örnekte gösterildiği gibi bir lambda ifadesi veya anonim bir yöntem içerebilir:

// Declare a delegate.
delegate void WorkCallback(int x);

// Instantiate the delegate using an anonymous method.
WorkCallback d = (int k) => { /* ... */ };

Temsilci parametresi olarak geçirdiğiniz yöntemin, temsilci bildirimiyle aynı imzaya sahip olması gerekir. Temsilci örneği statik veya örnek yöntemini kapsülleyebilir.

Not

Temsilcinin out parametresini kullanabilmesine rağmen, hangi temsilcinin çalıştırılacağını bilemediğinizden, çok noktaya yayın olay temsilcileriyle kullanılmasını önermiyoruz.

Tek bir aşırı yüke sahip yöntem gruplarının doğal bir türü vardır. Derleyici, temsilci türü için dönüş türünü ve parametre türlerini çıkarsayabilir:

var read = Console.Read; // Just one overload; Func<int> inferred
var write = Console.Write; // ERROR: Multiple overloads, can't choose

Örnekler

Aşağıdaki örnek, temsilci bildirmenin ve kullanmanın basit bir örneğidir. Hem temsilci MultiplyCallback hem de ilişkili yöntem MultiplyNumbers aynı imzaya sahiptir.

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

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

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

        // Invoke the delegate object.
        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.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

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

Aşağıdaki örnekte, bir temsilci hem statik hem de örnek yöntemlerine eşlenir ve her birinden belirli bilgileri döndürür.

// Declare a delegate
delegate void Callback();

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

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

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

        // Map the delegate to the instance method:
        Callback 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.
*/

Ayrıca bkz.