Является ли callback циклической ссылкой?
Имею ввиду ситуацию с двумя объектами - объект A содержит объект B, а объект B имеет делегат, указывающий на метод объекта A.
Ответы (1 шт):
Здесь необходимо уточнение, циклическая ссылка или циклическая зависимость.
Ссылка - это когда в оперативной памяти член одного объекта ссылается на член другого объекта. Зависимость - это когда один объект не может функционировать без другого.
Приведу пример:
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()
{
// ...
}
}