630
Chương 16: Các giao diện và mẫu thông dụng
•
Mã client nên có khả năng gọi đi gọi lại phương thức
Dispose
mà không gây ra các ảnh
hưởng bất lợi.
•
Trong các ứng dụng hỗ-trợ-đa-tiểu-trình, điều quan trọng là chỉ có một tiểu trình thực
thi phương thức
Dispose
. Thông thường, bảo đảm sự đồng bộ tiểu trình là nhiệm vụ của
mã client, mặc dù bạn có thể hiện thực sự đồng bộ bên trong phương thức
Dispose
.
•
Phương thức
Dispose
không nên ném ngoại lệ.
•
Vì phương thức
Dispose
dọn dẹp tất cả nên không cần gọi finalizer của đối tượng.
Phương thức
Dispose
của bạn nên gọi phương thức
GC.SuppressFinalize
để bảo đảm
finalizer không được gọi trong quá trình thu gom rác.
•
Hiện thực một finalizer sao cho phương thức
Dispose
sẽ được nó gọi theo một cơ chế
an toàn trong trường hợp mã client gọi
Dispose
không đúng. Tuy nhiên, nên tránh tham
chiếu đến các đối tượng được-quản-lý trong finalizer vì không rõ trạng thái của đối
tượng.
•
Nếu một lớp khả-hủy thừa kế một lớp khả-hủy khác, phương thức
Dispose
của lớp con
phải gọi phương thức
Dispose
của lớp cha. Gói phần mã của lớp con trong một khối
try
và gọi phương thức
Dispose
của lớp cha trong một mệnh đề
finally
để bảo đảm việc
thực thi.
•
Các phương thức và thuộc tính khác của lớp nên ném ngoại lệ
System.ObjectDisposedException
nếu mã client thực thi một phương thức trên một đối
tượng đã bị hủy.
Lớp
DisposeExample
dưới đây minh họa một hiện thực phổ biến của mẫu Dispose:
using System;
// Hiện thực giao diện IDisposable.
public class DisposeExample : IDisposable {
// Phần tử dữ liệu private dùng để báo hiệu
// đối tượng đã bị hủy hay chưa.
bool isDisposed = false;
// Phần tử dữ liệu private dùng để lưu giữ
// handle của tài nguyên không-được-quản-lý.
private IntPtr resourceHandle;
// Phương thức khởi dựng.
public DisposeExample() {
// Thu lấy tham chiếu đến tài nguyên không-được-quản-lý.