Поиск

Определение делегатов в качестве статических членов

Довольно неуклюжее решение создавать экземпляр делегата при каждом его применении, но в С# можно определять метод, который используется при создании делегата как статический член класса. Ниже приведен предыдущий пример с применением такого подхода. Заметьте, что теперь делегат определен как статический член класса 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); } >
ПРИМЕЧАНИЕ Поскольку общим правилом именования делегатов является добавление слова Callback к имени метода, принимающего делегат в качестве аргумента, можно по ошибке использовать имя этого метода вместо имени делегата. При этом компилятор уведомит, что вы указали метод там, где ожидается класс. Получив такую ошибку, помните: проблема в том, что вы указали метод вместо делегата.