从Delegate构造委托。新代表指向什么?

时间:2012-07-08 09:20:48

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

请考虑以下事项:

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

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

a2指的是什么?它是a1,a1的浅表副本还是a1的深层副本?

1 个答案:

答案 0 :(得分:4)

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方面保持活跃。