如何在c#中像使用引用类型一样使用delegate?

问题描述 投票:-2回答:2

我发现delegate的行为像值类型,但我想把它们作为引用类型使用。

除了在delegate上封装一个类让它表现为引用类型外,还有什么更好的方法吗?

首先,让我解释一下什么叫 "表现得像值类型"。

delegate fun void();

void a() { }

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

结果显示... B 只不过 Aa. 在这里,代表们就像 int 类型,这样,当。

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

B = A;
A += a;

结果是 A == 1B == 0.

更具体地说,我想让委托人的行为像一个指针一样,当 A 变化。B 也会发生变化。当 A += a,'B'也隐式地得到'a'。

c# delegates pass-by-reference
2个回答
1
投票

我想你问的是,你是否可以更新一个委派引用,并将其自动反映到另一个委派引用中。你可以--不是 恰恰 的方式,但通过链式事件,你可以为一个事件添加一个处理程序,然后从另一个事件中调用它。

例如,你可以在一个事件中添加处理程序,并让它从另一个事件中调用。

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();
}

Output:

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
投票

没有直接的方法。

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

链接到源代码

© www.soinside.com 2019 - 2024. All rights reserved.