delegat (C++/CLI i C++/CX)
Deklaruje typ reprezentujący wskaźnik funkcji.
Wszystkie środowiska wykonawcze
Zarówno środowisko wykonawcze systemu Windows, jak i środowisko uruchomieniowe języka wspólnego obsługują delegatów.
Uwagi
delegate to kontekstowe słowo kluczowe. Aby uzyskać więcej informacji, zobacz Kontekstowe słowa kluczowe.
Aby wykryć w czasie kompilacji, jeśli typ jest delegatem, użyj __is_delegate()
cech typu. Aby uzyskać więcej informacji, zobacz Obsługa kompilatora dla cech typów.
Środowisko wykonawcze systemu Windows
Język C++/CX obsługuje delegatów z następującą składnią.
Składnia
access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)
Parametry
dostęp
(opcjonalnie) Dostępność delegata, który może być public
(wartość domyślna) lub private
. Prototyp funkcji można również zakwalifikować za pomocą const
słów kluczowych lub volatile
.
zwracany typ
Zwracany typ prototypu funkcji.
identyfikator typu delegata
Nazwa zadeklarowanego typu delegata.
parameters
(Opcjonalnie) Typy i identyfikatory prototypu funkcji.
Uwagi
Użyj identyfikatora typu delegata, aby zadeklarować zdarzenie z tym samym prototypem co delegat. Aby uzyskać więcej informacji, zobacz Delegaty (C++/CX).
Wymagania
Opcja kompilatora: /ZW
środowiska uruchomieniowe w trakcie wykonania
Środowisko uruchomieniowe języka wspólnego obsługuje delegatów z następującą składnią.
Składnia
access
delegate
function_declaration
Parametry
dostęp
(opcjonalnie) Dostępność delegata poza zestawem może być publiczna lub prywatna. Wartość domyślna to prywatna. Wewnątrz klasy delegat może mieć dostęp do dowolnych ułatwień dostępu.
function_declaration
Podpis funkcji, która może być powiązana z pełnomocnikem. Zwracany typ delegata może być dowolnym typem zarządzanym. Ze względów współdziałania zaleca się, aby zwracany typ delegata był typem CLS.
Aby zdefiniować delegata bez ruchu przychodzącego, pierwszy parametr w function_declaration powinien być typem this
wskaźnika dla obiektu.
Uwagi
Delegaty są multiemisji: "wskaźnik funkcji" może być powiązany z co najmniej jedną metodą w klasie zarządzanej. Słowo kluczowe delegata definiuje typ delegata multiemisji z określonym podpisem metody.
Delegat może być również powiązany z metodą klasy wartości, taką jak metoda statyczna.
Delegat ma następujące cechy:
Dziedziczy
System::MulticastDelegate
z elementu .Ma konstruktor, który przyjmuje dwa argumenty: wskaźnik do klasy zarządzanej lub null (w przypadku powiązania z metodą statyczną) i w pełni kwalifikowaną metodę określonego typu.
Ma metodę o nazwie
Invoke
, której podpis jest zgodny z zadeklarowanym podpisem delegata.
Po wywołaniu delegata jego funkcje są wywoływane w kolejności, w której zostały dołączone.
Zwracana wartość delegata jest zwracaną wartością z ostatniej dołączonej funkcji składowej.
Delegatów nie można przeciążyć.
Delegaty mogą być powiązane lub niezwiązane.
Podczas tworzenia wystąpienia pełnomocnika powiązanego pierwszy argument będzie odwołaniem do obiektu. Drugim argumentem wystąpienia delegata jest adres metody obiektu klasy zarządzanej lub wskaźnik do metody typu wartości. Drugi argument wystąpienia delegata musi nazwać metodę składnią pełnego zakresu klasy i zastosować operator address-of.
Podczas tworzenia wystąpienia delegata bez ruchu przychodzącego pierwszy argument będzie adresem metody obiektu klasy zarządzanej lub wskaźnikiem metody typu wartości. Argument musi nazwać metodę składnią zakresu pełnej klasy i zastosować operator address-of.
Podczas tworzenia delegata do funkcji statycznej lub globalnej wymagany jest tylko jeden parametr: funkcja (opcjonalnie adres funkcji).
Aby uzyskać więcej informacji na temat delegatów, zobacz
Wymagania
Opcja kompilatora: /clr
Przykłady
W poniższym przykładzie pokazano, jak zadeklarować, zainicjować i wywołać delegatów.
// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;
// declare a delegate
public delegate void MyDel(int i);
ref class A {
public:
void func1(int i) {
Console::WriteLine("in func1 {0}", i);
}
void func2(int i) {
Console::WriteLine("in func2 {0}", i);
}
static void func3(int i) {
Console::WriteLine("in static func3 {0}", i);
}
};
int main () {
A ^ a = gcnew A;
// declare a delegate instance
MyDel^ DelInst;
// test if delegate is initialized
if (DelInst)
DelInst(7);
// assigning to delegate
DelInst = gcnew MyDel(a, &A::func1);
// invoke delegate
if (DelInst)
DelInst(8);
// add a function
DelInst += gcnew MyDel(a, &A::func2);
DelInst(9);
// remove a function
DelInst -= gcnew MyDel(a, &A::func1);
// invoke delegate with Invoke
DelInst->Invoke(10);
// make delegate to static function
MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
StaticDelInst(11);
}
in func1 8
in func1 9
in func2 9
in func2 10
in static func3 11
Zobacz też
Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows