thẳng vào mãhiệu ứng kỳ lạ của C đóng cửa # trên garbage collector
class Program
{
private static WeakReference<EventHandler<EventArgs>> _noClosure;
private static WeakReference<EventHandler<EventArgs>> _closure;
static void Main(string[] args)
{
Init();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
EventHandler<EventArgs> target;
Console.WriteLine(_closure.TryGetTarget(out target));
Console.WriteLine(_noClosure.TryGetTarget(out target));
}
class C { public void Go() { } }
private static void Init()
{
_noClosure = new WeakReference<EventHandler<EventArgs>>((sender, args) =>
{
});
var s = new C();
_closure = new WeakReference<EventHandler<EventArgs>>((sender, args) =>
{
s.Go();
});
}
}
Kết quả tôi nhận được từ mã này là
False
True
Làm thế nào trên trái đất có thể như vậy?
P.S. Tôi đi vào điều này trong khi cố gắng tìm ra cách hoạt động của WeakEventManager
.
Đây có phải là chi tiết triển khai hay hành vi đó được nêu (ngụ ý) trong tài liệu ở đâu đó không? – ironic
@ironic: Thực tế là nó * không * xảy ra là chi tiết triển khai. Thực tế là nó * có thể * xảy ra là trong spec. (Nó nói rằng cùng một đại biểu có thể được tái sử dụng, anyway.) –