2011-10-26 75 views
12

Giả sử tôi có 2 lớp, Foo và Bar. Foo không có (và không thể có) liên quan đến Bar.C#: Tạo tham chiếu mạnh mẽ giữa các đối tượng, không có tham chiếu đến các đối tượng khác

Tuy nhiên, tôi muốn một trường hợp thanh để sống, miễn là nó foo dụ vẫn còn sống. Có cách nào để làm như vậy, mà không có foo thực sự tham khảo thanh?

Cảm ơn, Koen

+2

Khi bạn đang cố gắng thay đổi cách trình thu gom rác hoạt động, bạn nên xem xét kỹ thiết kế của mình và xem liệu nó có thể được thay đổi để hoạt động trong ngôn ngữ không. Điều đó nói rằng: Câu hỏi thú vị! =) – Jens

+0

Tại sao làm cho cuộc sống khó khăn cho chính mình bằng cách từ chối các giải pháp tầm thường? –

+0

@DavidHeffernan Có vẻ như họ có một số vấn đề phụ thuộc khiến họ không làm như vậy. – Steve

Trả lời

16

Có một cái nhìn tại ConditionalWeakTable Class.

Cho phép trình biên dịch tự động đính kèm trường đối tượng vào đối tượng được quản lý.

Về bản chất, đây là từ điển mà cả khóa và giá trị đều là WeakReference và giá trị được giữ nguyên miễn là khóa còn hoạt động.

Ví dụ, bạn có thể định nghĩa một

ConditionalWeakTable<Foo, Bar> table 

và thêm một cặp/Bar Foo. Cá thể Bar được giữ nguyên miễn là một tham chiếu đến cá thể Foo tồn tại. Bạn có thể tìm thấy cá thể Bar cho cá thể Foo bằng cách nhìn vào bảng.

+0

Phép thuật hoàn hảo, hoạt động như một sự quyến rũ, cảm ơn! – KoenJ

0

Rất khó để đưa ra đề xuất mà không biết chính xác những gì bạn đang cố gắng đạt được hoặc ý bạn là "sống". Thông thường bạn không cần phải lo lắng về tuổi thọ của các đối tượng được quản lý: chúng "chết" một cách tự nhiên khi chúng không còn được tham chiếu nữa.

Nhưng để làm những gì bạn muốn, hoặc cá thể Foo của bạn phải tham chiếu cá thể Bar hoặc một số đối tượng khác phải tham chiếu cả hai để tạo liên kết. Nó có thể là một tham chiếu đến một ví dụ Bar dưới dạng System.Object, tức là Foo không cần biết về loại Bar.

0

Thanh chỉ có thể không được hoàn thành nếu SOMETHING có tham chiếu đến nó. Chỉ cần có Foo nói điều đó khi nó có thể buông Bar.

+0

"Foo không có (và không thể có) liên quan đến Bar" .. –

0

Bạn có thể tạo một đối tượng công khai được gọi là BarReference trong loại Foo không?
Một người nào đó bên ngoài Foo nên đặt trường hợp Bar thích hợp cho thuộc tính này.
Miễn là có một tham chiếu đến trường hợp thanh nó sẽ không được GCed VÀ sử dụng đối tượng Foo không biết gì về loại Bar.

+0

"Foo không có (và không thể có) liên quan đến Bar" –

+0

** Loại ** Foo không có liên quan đến ** loại ** Bar nếu bạn sử dụng đối tượng như tôi đề nghị. Nếu không có mối quan hệ _semantic_ thì đây là một trường hợp khác. – ViktorZ

Các vấn đề liên quan