【问题标题】:How to use delegate like a reference types in c#如何在 c# 中像引用类型一样使用委托
【发布时间】:2020-08-12 15:09:26
【问题描述】:

我发现委托的行为类似于值类型,但我想将它们用作引用类型。

有什么办法比将一个类包装在一个委托上以使其表现为引用类型更好?

首先,让我解释一下“表现得像值类型”的含义:

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'。

【问题讨论】:

  • 委托类型是不可变的,因此它们不能用作引用类型。另外,A += a 实际上是赋值操作,而不是对对象的修改。如果我们以“引用”的方式考虑它,0 不会更改为 1A 只是分配给 1 - 一个全新的对象。
  • 不确定你在问什么。在任何情况下都不会更新A 持有的引用也不会更新B 持有的引用。也许您可以发布一个带有实际引用类型的示例来展示您正在寻找的行为?
  • 其实,A += a;然后 A() 调用 a() 两次。一个=一个;一个+=b;将调用 a() 和 b()

标签: c# delegates pass-by-reference


【解决方案1】:

没有直接的方法。

delegate void fun();

multicast delegate

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的新实例

Link to Source Code

【讨论】:

    【解决方案2】:

    我想您是在问是否可以更新一个委托引用并将其自动反映在另一个委托引用中。您不能完全按照您要求的方式,但通过链接事件,您可以将处理程序添加到一个事件并从另一个事件调用它。

    例如:

    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,但最后一行已发出。

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2011-09-11
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多