Является ли callback циклической ссылкой?

Имею ввиду ситуацию с двумя объектами - объект A содержит объект B, а объект B имеет делегат, указывающий на метод объекта A.


Ответы (1 шт):

Автор решения: aepot

Здесь необходимо уточнение, циклическая ссылка или циклическая зависимость.

Ссылка - это когда в оперативной памяти член одного объекта ссылается на член другого объекта. Зависимость - это когда один объект не может функционировать без другого.

Приведу пример:

class A
{
    public event Action SomeEvent;
}

class B
{
    public B()
    {
        var a = new A();
        a.SomeEvent += SomeHandler;
    }

    private void SomeHandler()
    {
        // ...
    }
}

В данном случае делегат события объекта A ссылается на метод в объекте класса B, а конструктор класса B вызывает конструктор класса A и подписывается на его событие.

С точки зрения ссылок цикличность присутствует. А вот с точки зрения зависимостей отсутствует, так как класс A ничего не знает про существование класса B и может совершенно исправно работать даже если класс B будет удалён из проекта, а класс A будет создавать например какой-нибудь класс C.

То есть циклической зависимости здесь нет. Именно циклические зависимости могут стать источником проблем при реализации приложения, когда потребуется взаимная модификация зависимых классов. О ссылках здесь речи нет, о них не стоит беспокоиться.

Вот пример циклической зависимости:

class A
{
    public void SomeMethod()
    {
        var b = B.Instance;
        b.SomeMethod();
    }
}

class B
{
    public static B Instance { get; private set; }

    public B()
    {
        Instance = this;
        var a = new A();
        a.SomeMethod();
    }

    public void SomeMethod()
    {
        // ...
    }
}
→ Ссылка