次の点を考慮してください。
Action<int, T> a1 = new Action<int, T>(_insert);
Action<int, T> a2 = new Action<int, T>(a1);
a2 は何を指していますか? それは a1 ですか、それとも a1 の浅いコピーですか、それとも a1 の深いコピーですか?
次の点を考慮してください。
Action<int, T> a1 = new Action<int, T>(_insert);
Action<int, T> a2 = new Action<int, T>(a1);
a2 は何を指していますか? それは a1 ですか、それとも a1 の浅いコピーですか、それとも a1 の深いコピーですか?
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
はブラック ボックスとして扱われます。したがって、GCに関しては生きa2
続けます。a1