Принципы объектно-ориентированного программирования

         

Создавайте делегаты только при необходимости



Создавайте делегаты только при необходимости

В двух примерах, которые мы рассмотрели, делегаты создаются независимо от того, будут ли они когда-либо использоваться. В рассмотренных примерах ничего плохого в этом нет, поскольку известно, что они будут вызываться. Но в целом при определении делегатов важно решить, когда их создавать. Скажем, может случиться, что создание делегатов потребует немалого времени и затрат. В таких случаях, когда вы знаете, что клиент обычно не обращается к данному методу обратного вызова, можно отложить создание делегата до момента, когда он действительно потребуется, заключив создание его экземпляра в оболочку свойства. Это иллюстрирует следующий измененный класс 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); }

>

 

Содержание раздела