Aracılığıyla paylaş


Adlandırılmış ve Anonim Yöntemler ile Temsilciler (C# Programlama Kılavuzu)

Temsilci adlandırılmış 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öntemi veya örnek yöntemini 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

Temsilci out parametresini kullanabildiğinden, hangi temsilcinin çağrılacağını bilmediğiniz için çok noktaya yayın olay temsilcileriyle kullanılmasını önermeyiz.

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 temsilcinin hem MultiplyCallbackde ilişkili yönteminin MultiplyNumbersaynı imzaya sahip olduğuna dikkat edin

// 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.