|
Metodlarni delegatga moslash
|
bet | 8/9 | Sana | 13.02.2024 | Hajmi | 1 Mb. | | #156042 |
Bog'liq 37-mavzuMetodlarni delegatga moslash
Yuqorida tavsiflanganidek, metodlar bir xil qaytish turiga va bir xil parametrlar to'plamiga ega bo'lsa, delegatga mos keladi. Shuni yodda tutish kerakki, ref va out modifikatorlari ham hisobga olinadi. Masalan, bizda delegat bor deylik:
delegate void Delegat_misol(int a, double b); Masalan, ushbu delegatga quyidagi metod mos keladi:
void Method1(int g, double n) { } Va quyidagi metodlar mos kelmaydi:
int Method2(int g, double n) { } void Method3(double n, int g) { } void Method4(ref int g, double n) { }
void Method5(out int g, double n) { g = 6; }
Bu yerda Method2 metodi delegat turiga qaraganda boshqa qaytish turiga ega. Method3-da boshqa parametrlar to'plami mavjud. Method4 va Method5 parametrlari delegat parametrlaridan ham farq qiladi, chunki ular ref va out modifikatorlariga ega.
Yuqoridagi misollarda delegat o'zgaruvchisi bitta metodga ishora qildi. Aslida, delegat bir xil signatura va qaytish turiga ega bo'lgan ko'plab usullarni ko'rsatishi mumkin. Delegat tarkibidagi barcha metodlar maxsus ro'yxatga kiradi - chaqiruvlar ro'yxati. Va delegat chaqirilganda, ushbu ro'yxatdagi barcha metodlar ketma-ket chaqiriladi. Va biz ushbu ro'yxatga bitta emas, balki bir nechta metodni qo'shishimiz mumkin:
using System; class Program
{
delegate void Message();
static void Main(string[] args)
{
Message mes1 = Hello;
mes1 += HowAreYou; mes1(); Console.Read();
}
private static void Hello()
{
Console.WriteLine("Hello");
}
private static void HowAreYou()
{
Console.WriteLine("How are you?");
} }
Yana bir misol
using System; class Program {
delegate void amal(double a, double b);
static void SqrtSum(double a, double b)
{
Console.WriteLine( "Yig'indi ildizi: "+Math.Sqrt(a + b)); }
static void SqrtMultiply(double a, double b)
{
Console.WriteLine( "Ko'paytma ildizi " +Math.Sqrt(a
* b));
}
static void Main() {
amal del1;
del1 = SqrtSum;
del1 += SqrtMultiply;
del1(6, 10);
del1 -= SqrtMultiply;
del1(9, 16); Console.ReadLine();
}
}
|
| |