3

考虑以下:

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

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

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

4

1 回答 1

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被视为黑盒。因此相对于GCa2会保持存活。a1

于 2012-07-08T09:29:24.557 回答