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