[Previous] [Contents] [Next]

Creating Delegates Only When Needed


In the two examples you've seen so far, the delegate is created whether or not it's ever used. That was fine in those examples because I knew that it would always be called. However, when defining your delegates, it's important to consider when to create them. Let's say, for example, that the creation of a particular delegate is time-consuming and not something you want to do gratuitously. In these situations in which you know the client won't typically call a given callback method, you can put off the creation of the delegate until it's actually needed by wrapping its instantiation in a property. To illustrate how to do this, a modification of the DBManager class follows that uses a read-only property-because only a getter method is present-to instantiate the delegate. The delegate will not be created until this property is referenced.

using System;

class DBConnection
{
    public DBConnection(string name)
    {
        this.name = name;
    }

    protected string Name;
    public string name
    {
        get
        {
            return this.Name;
        }
        set

        {
            this.Name = value;
        }
    }
}

class DBManager
{
    static DBConnection[] activeConnections;
    public void AddConnections()
    {
        activeConnections = new DBConnection[5];
        for (int i = 0; i < 5; i++)
        {
            activeConnections[i] = new
                DBConnection("DBConnection " + (i + 1));
        }
    }

    public delegate void EnumConnectionsCallback(DBConnection connection);
    public static void EnumConnections(EnumConnectionsCallback callback)
    {
        foreach (DBConnection connection in activeConnections)
        {
            callback(connection);
        }
    }
}

class Delegate3App
{
    public DBManager.EnumConnectionsCallback myCallback
    {
        get
        {
            return new DBManager.EnumConnectionsCallback
                            (ActiveConnectionsCallback);
        }
    }

    public static void ActiveConnectionsCallback(DBConnection connection)
    {
        Console.WriteLine
            ("Callback method called for " + connection.name);
    }

    public static void Main()
    {
        Delegate3App app = new Delegate3App();

        DBManager dbMgr = new DBManager();
        dbMgr.AddConnections();

        DBManager.EnumConnections(app.myCallback);
    }
}

[Previous] [Contents] [Next]