Делегати (Visual Basic), Microsoft Docs
Делегатите са обекти, които препращат към методи. Понякога се описват като безопасни за типа указатели на функции, защото са подобни на указателите на функции, използвани в други езици за програмиране. Но за разлика от указателите на функции, делегатите на Visual Basic са референтни типове, базирани на клас, System.Delegate. Делегатите могат да се отнасят както към вида общи методи - методи, които могат да бъдат извикани без конкретен екземпляр на клас, така и към методи на екземпляр.
Делегати и събития
Делегатите са особено полезни, когато трябва да посредничите между извикващите и извиканите процедури. Например, искате обектът, който предизвиква събитието, да може да извиква различни манипулатори на събития при различни условия. За съжаление, обектът, който предизвиква събитията, не може да знае предварително кога манипулатор на събития ще обработи конкретно събитие. Visual Basic ви позволява динамично да свързвате манипулатори на събития със събития, като създавате делегат с помощта на оператора AddHandler. По време на изпълнение делегатът предава повиквания към подходящото събитие манипулатор.
Въпреки че потребителят може да създаде свои собствени делегати, в повечето случаи Visual Basic създава делегат според дадените условия. Например изразът Event имплицитно дефинира клас делегат с име EventHandler като вложен клас на класа, съдържащ оператора Event и със същия подпис като събитието. Операторът AddressOf имплицитно инстанцира делегат, който се отнася до конкретна процедура. Следните два реда код са еквивалентни. Щракнете върху изпратено като аргумент. Вторият ред е по-удобен начинполучаване на същия резултат.
В случаите, когато компилаторът може да определи типа делегат от контекста, може да се използва бърз начин за създаване на делегати.
Деклариране на събития с помощта на съществуващ тип делегат
В някои случаи може да е необходимо да се декларира събитие, за да се използва съществуващ тип делегат като основен делегат. Това се прави с помощта на следния синтаксис:
Тази техника е най-ефективна, когато трябва да насочите множество събития към един и същ манипулатор.
Делегиране на променливи и параметри
Делегатите могат да се използват и за други задачи, които не са свързани със събития, като разхлабена нишка. Те могат да се използват и с процедури, които изискват различни версии на функции да бъдат извиквани по време на изпълнение.
За да коригирате този проблем, можете да създадете процедура за сортиране във вашия клас, която използва стандартното сортиране по азбучен ред в повечето списъци, но също така може да превключи по време на изпълнение към персонализирана процедура за сортиране за автомобилни артикули.За да направите това, предавате процедурата за персонализирано сортиране на класа за сортиране по време на изпълнение, като използвате делегати.
AddressOf и ламбда изрази
Всеки клас делегат дефинира конструктор, на който се предава спецификация на метод на обект Аргументът на конструктор делегат трябва да бъде препратка към метод или ламбда израз.
За да посочите препратка към метод, използвайте следния синтаксис:
Типът на израза по време на компилиране трябва да бъде клас или интерфейс, който включва метод с посоченото име, чийто подпис съвпада с този на делегатния клас. Параметърът methodName трябва да бъде споделен метод или метод на екземпляр. Параметърът methodName не есе изисква дори ако е създаден делегат за метода на класа по подразбиране.
За да зададете ламбда израз, използвайте следния синтаксис:
Израз на функция ([parm As type, parm2 As type2, . ]).
Следващият пример показва как да зададете препратка за делегат с помощта на AddressOf и ламбда изрази.
Сигнатурата на функцията трябва да съответства на типа делегат. За повече информация относно ламбда изрази вижте Ламбда изрази (Visual Basic). За повече примери за присвояване на ламбда изрази и AddressOf на делегати вижте Неявно преобразуване на делегат (Visual Basic).
Свързани теми
Съдържа пример, който показва как да обвържете метод с делегат и след това да извикате метода чрез делегата.
Демонстрира използването на делегати за предаване на една процедура на друга.
Описва как да присвоите подпрограми и функции на делегати или манипулатори, дори когато техните подписи не са идентични.
Предоставя обща информация за събития във Visual Basic.