cuốn sách gpt4 ai đã làm

c# - C# : `if (xử lý)` tại sao chúng ta cần điều kiện `dùng mẫu`?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 19:39:34 28 4
mua khóa gpt4 Nike

Vì vậy, mặc địnhchế độ xử lýViệc thực hiện như sau:

lớp SomeClass : IDisposable
{
// Flag: Dispose đã được gọi chưa?
bool xử lý = sai;

// Triển khai công khai mẫu Vứt bỏ mà người tiêu dùng có thể gọi được.
khoảng trống công khai Vứt bỏ()
{
Vứt bỏ (đúng);
GC.SuppressFinalize(cái này);
}

// Triển khai mẫu Dispose được bảo vệ.
khoảng trống ảo được bảo vệ Vứt bỏ (xử lý bool)
{
nếu (xử lý)
return;

nếu (xử lý) {
// Giải phóng mọi đối tượng được quản lý khác tại đây.
}

// Giải phóng mọi đối tượng không được quản lý tại đây.
xử lý = đúng;
}

~SomeClass()
{
Vứt bỏ (sai);
}
}

Người ta nói:

Nếu lệnh gọi phương thức đến từ trình hoàn thiện (nghĩa là, nếu việc xử lý là SAI), chỉ mã giải phóng các tài nguyên không được quản lý mới được thực thi. Bởi vì thứ tự mà trình thu gom rác hủy các đối tượng được quản lý trong quá trình hoàn thiện không được xác định, nên gọi điều này là Vứt bỏ quá tải với giá trị là SAI ngăn người hoàn thiện cố gắng giải phóng các tài nguyên được quản lý có thể đã được thu hồi.

问题是:Tại sao giả định Một số lớp Các đối tượng được tham chiếu bởi các đối tượng có thể đã được giải phóng, chúng ta có nên cố gắng loại bỏ chúng khi gọi phương thức từ trình hoàn thiện không? Nếu những đồ vật đó vẫn được chúng ta sử dụng Một số lớp Tài liệu tham khảo đối tượng, chúng không thể được phát hành, phải không? Người ta nói:

Những cái có bộ hoàn thiện đang chờ xử lý (chưa chạy) vẫn được giữ nguyên (hiện tại) và được đưa vào một hàng đợi đặc biệt [...] Trước khi bộ hoàn thiện của mỗi đối tượng chạy,. nó vẫn còn sống rất nhiều - hàng đợi đó hoạt động như một gốc object.

Vì vậy, của chúng tôi Một số lớp Đối tượng lại được tham chiếu bởi hàng đợi (điều này giống như được tham chiếu bởi thư mục gốc). Một số lớp Các đối tượng khác được tham chiếu bởi đối tượng cũng nên tồn tại (vì chúng được tham chiếu qua Một số lớp đối tượng được tạo ra). Vậy tại sao và làm thế nào để gọi Một số lớp Phát hành chúng khi hoàn thiện?

câu trả lời hay nhất

Konrad Kokosa có lời giải thích ấn tượng trong cuốn sách của mình Quản lý bộ nhớ .NET chuyên nghiệp .(nhấn mạnh)

Trong quá trình GC, ở cuối giai đoạn Đánh dấu, GC kiểm tra hàng đợi quyết toán để xem liệu có bất kỳ đối tượng có thể quyết toán nào đã chết hay không. chúng chưa thể bị xóa vì các công cụ hoàn thiện của chúng sẽ cần được thực thi.Do đó, đối tượng đó là đã chuyển sang một hàng đợi khác gọi là hàng đợi fReachableTên của nó xuất phát từ thực tế là nó đại diện cho các đối tượng có thể truy cập cuối cùng - . những cái hiện có thể truy cập được chỉ vì đã hoàn tất. Nếu tìm thấy bất kỳ đối tượng nào như vậy, GC sẽ thông báo cho luồng hoàn thiện chuyên dụng có việc phải làm.

Chủ đề hoàn thiện lại là một luồng khác được tạo bởi thời gian chạy .NET. Nó loại bỏ từng đối tượng khỏi hàng đợi fReachable và gọi các bộ hoàn thiện của chúngĐiều này xảy ra sau khi GC tiếp tục các luồng được quản lý vì mã hoàn thiện có thể cần phân bổ các đối tượng. Vì gốc duy nhất của đối tượng này đã bị xóa khỏi hàng đợi fReachable, nên GC tiếp theo lên án thế hệ đối tượng này sẽ thấy rằng nó không thể truy cập được và lấy lại nó.

Hơn thế nữa, Hàng đợi fReachable được coi là gốc được xem xét trong giai đoạn Đánh dấu vì luồng hoàn thiện có thể không đủ nhanh để xử lý tất cả các đối tượng từ nó giữa các GCĐiều này khiến các đối tượng có thể hoàn thiện dễ rơi vào tình trạng khủng hoảng giữa vòng đời - chúng có thể ở trong hàng đợi fReachable trong một thời gian ở thế hệ 2 chỉ vì đang chờ quyết toán.

Tôi nghĩ mấu chốt ở đây là:

Hàng đợi fReachable được coi là gốc được xem xét trong giai đoạn Đánh dấu vì luồng hoàn thiện có thể không đủ nhanh để xử lý tất cả các đối tượng từ nó giữa các GC.

Về `if (disposition)` trong c# - C#: tại sao chúng ta cần điều kiện `dispose sample`?, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/55601015/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress