Делегаттарды біріктіру
Делегаттарды басқа делегаттарға біріктіруге болады. Мысалы:
1
2
3
4
5
6
7
8
9
|
Message mes1 = Hello;
Message mes2 = HowAreYou;
Message mes3 = mes1 + mes2; // делегаттарды біріктіру
mes3(); // mes1 және mes2 барлық әдістер шақырылады
void Hello() => Console.WriteLine("Hello");
void HowAreYou() => Console.WriteLine("How are you?");
delegate void Message();
|
Бұл жағдайда mes3 объектісі mes1 және mes2 делегаттарының бірігуін білдіреді. Делегаттарды біріктіру mes1 және ms2 делегаттарының барлық әдістері mes3 делегатының шақыру тізіміне енетінін білдіреді. Mes3 делегатын шақырған кезде, осы әдістердің барлығы бір уақытта шақырылады.
Делегатты шақыру
Жоғарыдағы мысалдарда делегат әдеттегі әдіс ретінде шақырылады. Егер делегат параметрлерді қабылдаса, онда оны шақырған кезде параметрлер үшін қажетті мәндер берілді:
1
2
3
4
5
6
7
8
9
10
11
|
Message mes = Hello;
mes();
Operation op = Add;
int n = op(3, 4);
Console.WriteLine(n);
void Hello() => Console.WriteLine("Hello");
int Add(int x, int y) => x + y;
delegate int Operation(int x, int y);
delegate void Message();
|
Делегатты шақырудың тағы бір әдісі Invoke() әдісін ұсынады:
1
2
3
4
5
6
7
8
9
10
11
|
Message mes = Hello;
mes.Invoke(); // Hello
Operation op = Add;
int n = op.Invoke(3, 4);
Console.WriteLine(n); // 7
void Hello() => Console.WriteLine("Hello");
int Add(int x, int y) => x + y;
delegate int Operation(int x, int y);
delegate void Message();
|
Если делегат принимает параметры, то в метод Invoke передаются значения для этих параметров.
Следует учитывать, что если делегат пуст, то есть в его списке вызова нет ссылок ни на один из методов (то есть делегат равен Null), то при вызове такого делегата мы получим исключение, как, например, в следующем случае:
1
2
3
4
5
6
|
Message? mes;
//mes(); // ! Қате: делегат null-ге тең
Operation? op = Add;
op -= Add; // ор делегаты бос
int n = op(3, 4); // ! Қате: делегат null-ге тең
|
Сондықтан делегатты шақырған кезде оның null-ге тең екендігін тексеру әрқашан жақсы. Немесе Invoke әдісін және шартты null операторын пайдалануға болады:
1
2
3
4
5
6
|
Message? mes = null;
mes?.Invoke(); // қате жоқ, делегат шақырылмайды
Operation? op = Add;
op -= Add; // ор делегаты бос
int? n = op?.Invoke(3, 4); // қате жоқ, делегат шақырылмайды, ал n = null
|
Егер делегат белгілі бір мәнді қайтарса, онда шақырулар тізімінен соңғы әдістің мәні қайтарылады (Егер шақырулар тізімінде бірнеше әдістер болса). Мысалы:
1
2
3
4
5
6
7
8
9
10
|
Operation op = Subtract;
op += Multiply;
op += Add;
Console.WriteLine(op(7, 2)); // Add(7,2) = 9
int Add(int x, int y) => x + y;
int Subtract(int x, int y) => x - y;
int Multiply(int x, int y) => x * y;
delegate int Operation(int x, int y);
|
Достарыңызбен бөлісу: |