【发布时间】: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
考虑以下几点:
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
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 方面处于活动状态。
【讨论】:
b [原文如此] 引用 a.Invoke 而不是 a 引用的任何方法。因此,它最接近于浅拷贝。说它是另一个级别的间接可能更准确。