В двух примерах, которые мы рассмотрели, делегаты создаются независимо от того, будут ли они когда-либо использоваться. В рассмотренных примерах ничего плохого в этом нет, поскольку известно, что они будут вызываться. Но в целом при определении делегатов важно решить, когда их создавать. Скажем, может случиться, что создание делегатов потребует немалого времени и затрат. В таких случаях, когда вы знаете, что клиент обычно не обращается к данному методу обратного вызова, можно отложить создание делегата до момента, когда он действительно потребуется, заключив создание его экземпляра в оболочку свойства. Это иллюстрирует следующий измененный класс
DBManager,
в котором для создания экземпляра делегата используется неизменяемое свойство (поскольку для него представлен только метод-получатель), 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 DelegateSApp <
public DBManager.EnumConnectionsCallback myCallback
{
get
{
return new DBManager.EnumConnectionsCallback (ActiveConnectionsCallback); } >
public static void ActiveConnectionsCallback(DBConnection
connection) {
Console.WriteLine
("Callback method called for " + connection.name); }
Bublic static void MainQ {
DelegateSApp app = new Delegate3App();
DBManager dbMgr = new DBManagerO; dbMgr.AddConnections();
DBManager.EnumConnections(app. myCallback); }
>