【问题标题】:Construct Delegate from Delegate. What does the new Delegate Point to?从委托构造委托。新的代表指向什么?
【发布时间】:2012-07-08 01:56:58
【问题描述】:

考虑以下几点:

Action<int, T> a1 = new Action<int, T>(_insert);

Action<int, T> a2 = new Action<int, T>(a1);

a2 指的是什么?是 a1,a1 的浅拷贝还是 a1 的深拷贝?

【问题讨论】:

    标签: c# reference delegates deep-copy shallow-copy


    【解决方案1】:

    a2 引用 a1。这是 IL:

    .method private hidebysig static void Main() cil managed
    {
        .entrypoint
        .maxstack 3
        .locals init (
            [0] class [mscorlib]System.Action a1,
            [1] class [mscorlib]System.Action a2)
        L_0000: nop 
        L_0001: ldnull 
        L_0002: ldftn void WebTools.ConsoleTest.Program::Main()
        L_0008: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
        L_000d: stloc.0 
        L_000e: ldloc.0 
        L_000f: ldftn instance void [mscorlib]System.Action::Invoke() #1
        L_0015: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
        L_001a: stloc.1 
        L_0020: nop 
        L_0021: ret 
    }
    

    在 #1 处,IL 代码引用 a1 的 Invoke 方法和实例 a1 本身。

    浅拷贝意味着a1 的内容被复制,但没有被复制。对象a1 被视为黑盒。因此,a2 将保持a1 在 GC 方面处于活动状态。

    【讨论】:

    • 谢谢! p.s.:我仍在处理我的 UI 泛滥问题(来自 herehere),一旦我解决了它,我就会通过评论告诉你:)
    • 对我来说,你的回答引发的问题比它回答的要多。我对这个 IL 列表的阅读是 b [原文如此] 引用 a.Invoke 而不是 a 引用的任何方法。因此,它最接近于浅拷贝。说它是另一个级别的间接可能更准确。
    • @stakx,浅拷贝意味着 a1 的 内容 被复制,但没有被复制。对象 a1 被视为黑盒。因此,对于 GC,a2 将使 a1 保持活动状态。
    • @stakx 老实说我不熟悉 IL .. 所以你认为这在某种程度上是不正确的(如果我会拒绝我接受的答案 - 只是为了不向 SO 社区提供错误的答案)
    • @usr,确切地说(尽管 GC 与这个问题几乎无关)!感谢您在回答中添加说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多