用C#扩展方法订阅事件是一种不好的做法吗?

用C#扩展方法订阅事件是一种不好的做法吗?,c#,events,extension-methods,C#,Events,Extension Methods,在这种情况下,订阅proxy CloseCompleted事件是否不好 public static void Close(this MyWCFServiceClient proxy) { proxy.CloseCompleted += (o, e) => { if (e.Error != null) proxy.Abort(); };

在这种情况下,订阅proxy CloseCompleted事件是否不好

public static void Close(this MyWCFServiceClient proxy)
{
            proxy.CloseCompleted += (o, e) =>
            {
                if (e.Error != null)
                    proxy.Abort();
            };

            proxy.CloseAsync();
}
当代理不再被任何代码引用时,它是否仍会被垃圾收集,或者扩展方法中的事件订阅是否会挂起并保留对代理的引用?

我不会说这是一种不好的做法,但在一般情况下,很可能会发生这种情况,即,在
//
标记中明确记录。然而,在本例中,我们讨论的是对象的死亡——因此调用方可能不希望在调用该方法后对该对象做太多的处理。我还想明确(可能是在方法名中)这是异步的


回收垃圾;事件使订户保持活动状态;不是出版商。如果
代理
符合条件,则将收集该代理。匿名方法似乎不访问任何捕获的作用域(除了
代理
本身),因此没有什么有趣的事情可以保持活动状态(除了代理实例本身)。

代理引用了您的匿名代理,反之亦然。因此,如果没有人引用该代理,它和匿名服务器都将被清除。

那么proxy.Abort()又如何呢?这里的Proxy是一个方法的参数,所以它被这个lambda捕获,因此必须创建并分配一个包含对Proxy对象的引用的类(毕竟,它只是一个普通的方法参数,作为一个扩展方法不会改变任何东西)。当然,当涉及到收集时,它不会改变任何东西,因为它将以同样的方式工作。哦,是的,的确如此。你可以通过选择发送者来避免这种情况,但你是对的。正如你所说,它不会影响收藏。