C# - Delegasi
Delegasi C# mirip dengan pointer ke fungsi, dalam C atau C++. Seorang delegasi adalah variabel tipe referensi yang menyimpan referensi ke metode. Referensi dapat diubah saat runtime.
Delegasi terutama digunakan untuk mengimplementasikan acara dan metode panggilan balik. Semua delegasi secara implisit berasal dari System.Delegate kelas.
Mendeklarasikan Delegasi
Deklarasi delegasi menentukan metode yang dapat direferensikan oleh delegasi. Delegasi dapat merujuk ke metode, yang memiliki tanda tangan yang sama dengan delegasi.
Misalnya, pertimbangkan delegasi
public delegate int MyDelegate (string s);
Delegasi sebelumnya dapat digunakan untuk mereferensikan metode apa pun yang memiliki satu string parameter dan mengembalikan int jenis variabel.
Sintaks untuk deklarasi delegasi adalah
delegate <return type> <delegate-name> <parameter list>
Menginisiasi Delegasi
Setelah tipe delegasi dideklarasikan, objek delegasi harus dibuat dengan baru kata kunci dan dikaitkan dengan metode tertentu. Saat membuat delegasi, argumen diteruskan ke baru ekspresi ditulis mirip dengan pemanggilan metode, tetapi tanpa argumen ke metode. Misalnya
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
Contoh berikut menunjukkan deklarasi, instantiasi, dan penggunaan delegasi yang dapat digunakan untuk referensi metode yang mengambil parameter integer dan mengembalikan nilai integer.
Demo Langsung
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl {
class TestDelegate {
static int num = 10;
public static int AddNum(int p) {
num += p;
return num;
}
public static int MultNum(int q) {
num *= q;
return num;
}
public static int getNum() {
return num;
}
static void Main(string[] args) {
//create delegate instances
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
//calling the methods using the delegate objects
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut
Value of Num: 35
Value of Num: 175
Multicasting Delegasi
Objek delegasi dapat disusun menggunakan operator "+". Delegasi yang terdiri dari panggilan dua delegasi itu terdiri dari. Hanya delegasi dari jenis yang sama yang dapat dikomposisikan. Operator "-" dapat digunakan untuk menghapus delegasi komponen dari delegasi yang dibuat.
Dengan menggunakan properti delegasi ini, Anda dapat membuat daftar metode pemanggilan yang akan dipanggil saat delegasi dipanggil. Ini disebut multicasting dari seorang delegasi. Program berikut menunjukkan multicasting dari delegasi −
Demo Langsung
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl {
class TestDelegate {
static int num = 10;
public static int AddNum(int p) {
num += p;
return num;
}
public static int MultNum(int q) {
num *= q;
return num;
}
public static int getNum() {
return num;
}
static void Main(string[] args) {
//create delegate instances
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
//calling multicast
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut
Value of Num: 75
Menggunakan Delegasi
Contoh berikut menunjukkan penggunaan delegasi. Delegasi printString dapat digunakan untuk referensi metode yang mengambil string sebagai input dan tidak mengembalikan apa pun.
Kami menggunakan delegasi ini untuk memanggil dua metode, yang pertama mencetak string ke konsol, dan yang kedua mencetaknya ke file −
Demo Langsung
using System;
using System.IO;
namespace DelegateAppl {
class PrintString {
static FileStream fs;
static StreamWriter sw;
// delegate declaration
public delegate void printString(string s);
// this method prints to the console
public static void WriteToScreen(string str) {
Console.WriteLine("The String is: {0}", str);
}
//this method prints to a file
public static void WriteToFile(string s) {
fs = new FileStream("c:\\message.txt",
FileMode.Append, FileAccess.Write);
sw = new StreamWriter(fs);
sw.WriteLine(s);
sw.Flush();
sw.Close();
fs.Close();
}
// this method takes the delegate as parameter and uses it to
// call the methods as required
public static void sendString(printString ps) {
ps("Hello World");
}
static void Main(string[] args) {
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
sendString(ps1);
sendString(ps2);
Console.ReadKey();
}
}
}
Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut
The String is: Hello World