Tôi có một bài kiểm tra đó tôi mong đợi để vượt qua nhưng hành vi của các Collector rác không phải là tôi coi:Garbage Collection nên đã gỡ bỏ đối tượng nhưng WeakReference.IsAlive vẫn trở về đúng
[Test]
public void WeakReferenceTest2()
{
var obj = new object();
var wRef = new WeakReference(obj);
wRef.IsAlive.Should().BeTrue(); //passes
GC.Collect();
wRef.IsAlive.Should().BeTrue(); //passes
obj = null;
GC.Collect();
wRef.IsAlive.Should().BeFalse(); //fails
}
Trong ví dụ này obj
đối tượng nên được GC'd và do đó tôi mong đợi tài sản WeakReference.IsAlive
trả lại false
.
Dường như vì biến số obj
được khai báo trong cùng phạm vi với GC.Collect
, nó không được thu thập. Nếu tôi di chuyển các khai báo obj và khởi tạo bên ngoài của phương pháp kiểm tra vượt qua.
Có ai có tài liệu tham khảo kỹ thuật hoặc giải thích về hành vi này không?
Bạn đã kiểm tra xem mã IL trông như thế nào? Ngoài ra, nó hoạt động theo cùng một cách để phát hành và gỡ lỗi xây dựng? –
Đoán ban đầu của tôi là tối ưu hóa trình biên dịch/thời gian chạy/bộ xử lý đang cắn bạn. Họ nhận ra bạn không bao giờ đọc 'obj' vì vậy nó được phép sắp xếp lại các hoạt động giữa các cuộc gọi phương thức khác. Hãy thử thêm một cái gì đó như 'Console.WriteLine (obj == null)' chỉ để ngăn chặn trình biên dịch làm điều đó. – Servy
Mẫu này hoạt động tốt trên máy của tôi. Tôi đang sử dụng 'Console.WriteLine' để ghi tham số' IsAlive' mặc dù thay vì 'Should()' – JaredPar