Team LiB
Previous Section Next Section

Chapter 8: Delegates, Events, and Namespaces

Delegates

A delegate is a type that defines a function signature, so that an instance of a delegate can call methods that match it. In C++ terms, a delegate is a fancy way to describe a function pointer.

Declaring a Delegate

A delegate declaration consists of four parts:

  • The keyword delegate

  • Followed by the return type of the function to be called

  • Followed by a name that will be generic to the function to be called

  • Followed by a parameter list

In the following example, the delegate called MyDelegate can call any function that returns an int and is passed a single string:

delegate int MyDelegate(string s);

You can use delegates to fire a single method, or you may multicast methods. You may initialize a new delegate using static or instance methods, using the following syntax:

MyDelegate Del1 = new MyDelegate(DoSomething);

You can also initialize a delegate using this syntax for multicasting:

MyDelegate Multicast = null;
m += new MyDelegate(DoSomething);
m += new MyDelegate(DoSomething2);

After you have initialized your delegate with values, you use it by calling the delegate, as follows:

del1(MyString);

In the multicast case, you call the delegate as follows:

m(MyString);

This will result in the DoSomething method being called, followed by the DoSomething2 method.

To remove a method from the delegate list, use this syntax:

m -= new MyDelegate(DoSomething2);

This will remove DoSomething2 from the delegate known as m.

Note 

All delegates support asynchronous and synchronous calls of their invocation list via the methods BeginInvoke, EndInvoke, and Invoke.

You can also iterate through a list of all the delegates via the following code:

foreach(Delegate D in MyInstanceDelegate(GetInvocationList())
{
      (cast)D(params);
}

It is also important to realize that every time you declare a delegate, a new class is generated. This class does the work for you under the hood.

When to Use a Delegate

You should consider using a delegate in the following situations:

  • You want to use a C-style function pointer.

  • You desire a single callback invocation.

  • You want the callback function registered at construction time rather than via a method call.

You should use an interface if the callback function involves complex behavior or when using Remoting.

The following example demonstrates using delegates.

Code Example: Delegates
Start example

using System;

namespace Client.Chapter_8___Delegates_Events_and_Namespaces
{
      class Delegates
      {
           //Creates a method pointer
            delegate int MyDelegate(string s);
            static void Main(string[] args)
            {
                  MyDelegate Del1 = new MyDelegate(DoSomething);
                  MyDelegate Del2 = new MyDelegate(DoSomething2);
                  string MyString = "Hello World";

                  Del1(MyString);
                  Del2(MyString);

                 //Or you can multicast delegates by doing this
                  MyDelegate Multicast = null;

                  Multicast += new MyDelegate(DoSomething);
                  Multicast += new MyDelegate(DoSomething2);

                 //Both DoSomething & DoSomething2 will be fired
                 //in the order they are added to the delegate
                  Multicast(MyString);
                  Multicast -= new MyDelegate(DoSomething2);
            }
            static int DoSomething(string s)
            {
                  return 0;
            }
            static int DoSomething2(string s)
            {
                  return 0;
            }
      }
}
End example

Team LiB
Previous Section Next Section