Довольно неуклюжее решение создавать экземпляр делегата при каждом его применении, но в С# можно определять метод, который используется при создании делегата как статический член класса. Ниже приведен предыдущий пример с применением такого подхода. Заметьте, что теперь делегат определен как статический член класса
myCallback
и этот член может использоваться в методе
Main,
так что клиенту нет нужды создавать экземпляр делегата.
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 AddConnectionsO
{
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 Delegate2App {
public static DBManager.EnumConnectionsCallback myCallback = new DBManager.EnumConnectionsCallback (ActiveConnectionsCallback);
public static void ActiveConnectionsCallback(DBConnection
connection) {
Console.WriteLine ("Callback method called for " +
connection.name); }
public static void MainQ {
DBManager dbMgr = new DBManagerQ;
dbMgr. AddConnectionsO;
DBManager. EnurnConnections(myCallback); } >