Амаллар.
Делегатлар ни тенглик ёки тенгсизлик маъносида таққослаш мумкин. Икки делегат тенг бўлади, агар уларнинг хар иккиси методларга ҳаволаларга эга бўлмаса, ёки улар бир хил тартибдаги бир хил методларга ҳаволаларни сақласа. Турли типдаги делегатларни фақат бир хил типдаги маълумотларни қайтарса ёки параметрларнинг рўйхати бир хил бўлганда таққосаш мумкин.
Бир хил типдаги делегатлар устида содда ва мураккаб қиймат бериш амалини бажариш мумкин, масалан:
Del d1 = new Del( o1.Do ); // o1.Do
Del d2 = new Del( o2.Do ); // o2.Do
Del d3 = d1 + d2; // o1.Do и o2.Do
d3 += d1; // o1.Do, o2.Do и o1.Do
d3 -= d2; // o1.Do и o1.Do
Агар турли вазиятларда методлар жамланмаси комбинацияларининг турли жамланмаларини чақиришга тўғри келганда бу амаллардан фойдаланиш мумкин.
Делегат худди string сатри каби маълумотларнинг ўзгарамйдиган типи ҳисобланади ва шунинг учун иҳтиёрий ўзгариш рўй берганда янги экземпляр яратилади, эскиси эса нокерак маълумотлар ташувчиси (сборщик мусоров) томонидан ўчириб ташланади.
Делегатларни методларга узатиш.
Делегат класс ҳисоблангани учун уни методларга параметр сифатида узатиш мумкин. Шундай қилиб, функционал параметрлаш таъминланади: методга нафақат турли маълумотларни, балки уларни қайта ишловчи қункцияларни хам узатиш мумкин. Функционал параметрлаш универсал методлар хамда тескари мурожаат имкониятларини таъминлаш учун қўлланиши мумкин.
Универсал методга содда намуна қилиб функциянинг аргумент қийматларининг диапазони хамда ўзгариш қадами ва хисобланаётган функциянинг кўриниши узатиладиган қийматлар жадвалини чиқарувчи методини олиш мумкин.
25.3-листинрг.
using System;
namespace ConsoleApplication1
{
public delegate double Fun( double x ); // делегат эълон қилиш
class Class1
{
public static void Table( Fun F, double x, double b )
{
Console.WriteLine( " ----- X ----- Y -----" );
while (x <= b)
{
Console.WriteLine( "| {0,8:0.000} | {1,8:0.000} |", x, F(x));
x += 1;
}
Console.WriteLine( " ---------------------" );
}
public static double Simple( double x )
{
return 1;
}
static void Main()
{
Console.WriteLine( " Sin функциясининг жадвали " );
Table( new Fun( Math.Sin ), -2, 2 );
Console.WriteLine( " Simple функциясининг жадвали " );
Table( new Fun( Simple ), 0, 3 );
}
}
}
Дастур ишининг натижаси
Sin функциясининг жадвали
----- X ----- Y -----
| -2,000 | -0,909 |
| -1,000 | -0,841 |
| 0,000 | 0,000 |
| 1,000 | 0,841 |
| 2,000 | 0,909 |
---------------------
Simple функциясининг жадвали
----- X ----- Y -----
| 0,000 | 1,000 |
| 1,000 | 1,000 |
| 2,000 | 1,000 |
| 3,000 | 1,000 |
---------------------
Тескари мурожаат (callback) ўзида бошқа функцияга параметр сифатида узатиладиган функцияни мужассамлаштиради. 17.1-расмга қаранг. Айтайлик, кутубхонада параметри бошқа функция бўлган А функция тавсифланган. Чақирувчи кодда талаб қилинган сигнатурали (B) функция тавсифланган ва у А функцияга узатилмоқда. А функциянинг чақирилиши В ни ҳам чақиради, яъни бошқарув кутубхонадаги функциялан чақи рувчи кодга узатилади..
17.1-расм. Тескари мурожаат механизми.
Тескари мурожаат механизми дастурлашда кенг қўлланилади. Масалан, у Windows нинг кўплаб функцияларида амалга оширилган.
C# дастурлаш тилида 2.0 версиядан фойдаланувчи Visual Studio 2005 дан бошлаб делегатлар учун синтаксиснинг соддалаштирилган вариантидан фойдалаиш мумкин. Биринчи соддалаштириш кўп холларда делегат экземплярларини ошкор усулда яратишнинг талаб қилинмаслиги билан боғлиқ, чунки у ўрни келганда тўғридан – тўғри яратилади. Иккинчи соддалаштириш шундаки, бевосита делегатдан фойдаланилаётган жойда тавсифланадиган аноним методлар код парчаларини ишлаб чиқиш имконияти билан боғлиқ:
Do'stlaringiz bilan baham: |