Bagikan melalui


Delegasi dengan Method Bernama vs. Method Anonim (Panduan Pemrograman C#)

Sebuah delegasi dapat dikaitkan dengan method bernama. Saat Anda membuat instance delegasi dengan menggunakan method bernama, method diteruskan sebagai parameter, misalnya:

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

Ini disebut menggunakan method bernama. Delegasi yang dibangun dengan method bernama dapat merangkum method statis atau method instance. Method bernama adalah satu-satunya cara untuk membuat instance delegasi di versi C#sebelumnya. Namun, dalam situasi di mana membuat method baru adalah overhead yang tidak diinginkan, C# memungkinkan Anda untuk membuat instance delegasi dan segera menentukan blok kode yang akan diproses delegasi ketika dipanggil. Blok dapat berisi lambda expression atau method anonim.

Method yang Anda berikan sebagai parameter delegasi harus memiliki signature yang sama dengan deklarasi delegasi. Sebuah delegasi instance dapat merangkum method statis atau method instance.

Catatan

Meskipun delegasi dapat menggunakan sebuah parameter keluar, kami tidak merekomendasikan penggunaannya dengan delegasi multicast event karena Anda tidak dapat mengetahui delegasi mana yang akan dipanggil.

Dimulai dengan C# 10, method grup dengan satu kelebihan memiliki tipe alami. Ini berarti xompiler dapat menyimpulkan tipe pengembalian dan tipe parameter untuk tipe delegasi:

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

Contoh

Berikut ini adalah contoh sederhana mendeklarasikan dan menggunakan delegasi. Perhatikan bahwa kedua delegasi, Del, dan method terkait, MultiplyNumbers, memiliki signature yang sama

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

Dalam contoh berikut, satu delegasi dipetakan ke method statis dan method instance dan mengembalikan informasi tertentu dari masing-masing.

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

Lihat juga