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