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;

Bu, adlandırılmış bir yöntem kullanılarak çağrı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. Ancak, yeni yöntem oluşturmanın istenmeyen bir ek yük olduğu bir durumda, C# bir temsilci örneği oluşturmanıza ve çağrıldığında temsilcinin işleyecekleri bir kod bloğunu hemen belirtmenize olanak tanır. Blok bir lambda ifadesi veya anonim bir yöntem içerebilir.

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

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.

C# 10'da başlayarak, tek bir aşırı yüke sahip yöntem gruplarının doğal bir türü vardır. Bu, derleyicinin temsilci türü için dönüş türünü ve parametre türlerini çıkarabileceği anlamına gelir:

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

Örnekler

Aşağıda temsilci bildirme ve kullanma işlemine yönelik basit bir örnek verilmiştir. Hem temsilcinin hem Delde 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.