它与lambdas无关.匿名委托可以观察到相同的行为.因此,如果您更改为代码
HandleMessage listener2 = delegate(string message) => { };
你得到相同的结果.
在第一种情况下,您在Test实例上有一个实例方法.由于在无效时没有对此实例的其他引用listener1
,因此可能会收集它.
在第二种情况下,匿名方法必须放在某种类型上(因为方法本身不能存在).在这种情况下,编译器将匿名方法作为静态方法放在您的Test
类上.此外,引用存储在Test
类型的静态成员中.因此Type
对该方法也有静态引用,这就是它在集合中存活的原因.
看一下IL,了解事情是如何连线的.
它与lambdas无关.匿名委托可以观察到相同的行为.因此,如果您更改为代码
HandleMessage listener2 = delegate(string message) => { };
你得到相同的结果.
在第一种情况下,您在Test实例上有一个实例方法.由于在无效时没有对此实例的其他引用listener1
,因此可能会收集它.
在第二种情况下,匿名方法必须放在某种类型上(因为方法本身不能存在).在这种情况下,编译器将匿名方法作为静态方法放在您的Test
类上.此外,引用存储在Test
类型的静态成员中.因此Type
对该方法也有静态引用,这就是它在集合中存活的原因.
看一下IL,了解事情是如何连线的.