Listing 4
using namespace System;
delegate void D(int x);
ref struct Actions
{
static void F1(int i)
{
Console::WriteLine("Actions::F1: {0}", i);
}
static void F2(int i)
{
Console::WriteLine("Actions::F2: {0}", i);
}
void F3(int i)
{
Console::WriteLine("instance of Actions::F3: {0}", i);
}
};
int main()
{
/*1*/ D^ cd1 = gcnew D(&Actions::F1); // invocation list contains F1
cd1(10);
Actions::F1: 10
/*2*/ D^ cd2 = gcnew D(&Actions::F2); // invocation list contains F2
cd2(15);
Actions::F2: 15
/*3*/ D^ cd3 = cd1 + cd2; // invocation list contains F1 + F2
cd3(20);
Actions::F1: 20
Actions::F2: 20
/*4*/ cd3 += cd1; // invocation list contains F1 + F2 + F1
cd3(25);
Actions::F1: 25
Actions::F2: 25
Actions::F1: 25
Actions^ t = gcnew Actions();
D^ cd4 = gcnew D(t, &Actions::F3);
/*5*/ cd3 += cd4; // invocation list contains F1 + F2 + F1 + t->F3
cd3(30);
Actions::F1: 30
Actions::F2: 30
Actions::F1: 30
instance of Actions::F3: 30
/*6*/ cd3 -= cd1; // remove right-most F1
cd3(35); // call F1, F2, then t->F3
Actions::F1: 35
Actions::F2: 35
instance of Actions::F3: 35
/*7*/ cd3 -= cd4; // remove t->F3
cd3(40); // call F1 then F2
/*8*/ cd3 -= cd1; // remove F1
cd3(45); // call F2
/*9*/ cd3 -= cd2; // remove F2, invocation list is empty
/*10*/Console::WriteLine("cd3 = {0}",
(cd3 == nullptr ? "null" : "not null"));
}
Actions::F1: 40
Actions::F2: 40
Actions::F2: 45
cd3 = null