Как использовать делегат как ссылочные типы в c# - PullRequest
0 голосов
/ 28 апреля 2020

Я обнаружил, что делегаты ведут себя как типы значений, но я хочу использовать их в качестве ссылочных типов.

Есть ли способ лучше, чем просто обернуть класс над делегатом, чтобы он вел себя как ссылочный тип?

Сначала позвольте мне объяснить, что означает "вести себя как тип значения":

delegate fun void();

void a() { }

void main()
{
    fun A;
    fun B;    
    B = A;
    A += a;
}

Результат показывает, что B не имеет ничего, кроме A a. Здесь делегаты похожи на int типы, такие, что когда:

int a = 1;
int B = 0;
int A = 0;

B = A;
A += a;

результат равен A == 1 и B == 0.

Чтобы быть более точным c, что я хочу, чтобы делегат вел себя как указатель, когда A изменяется, B также изменяется. Когда A += a, «B» также получает «a» неявно.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Я думаю, вы спрашиваете, можете ли вы обновить одну ссылку на делегат и автоматически отразить ее в другой ссылке на делегат. Вы можете - не точно так, как вы просите, но, связав события в цепочку, вы можете добавить обработчик для одного события и вызвать его из другого.

Например:

delegate void fun();

event fun A;
event fun B;

void main()
{
    A += () => Console.WriteLine("This was added to A");
    B += () => Console.WriteLine("This was added to B");
    B += () => A();  //Chain the events
    A += () => Console.WriteLine("This was added to A after A was already added to B");

    Console.WriteLine("Running B()....");
    B();
}

Вывод:

Running B()....
This was added to B
This was added to A
This was added to A after A was already added to B

Обратите внимание, что была выпущена последняя строка, даже если мы никогда не добавляли ее непосредственно к B.

0 голосов
/ 28 апреля 2020

Прямого пути нет.

delegate void fun();

Является ли многоадресный делегат , а

A += a;

компилируется в

IL_0035:  call       class [mscorlib]System.Delegate
                     [mscorlib]System.Delegate::Combine
                     ( class [mscorlib]System.Delegate,
                       class [mscorlib]System.Delegate )

который возвращает

return NewMulticastDelegate(resultList, resultCount);

, который возвращает новый экземпляр MulticastDelegate

Ссылка на исходный код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...