Μπορείς να χρησιμοποιήσεις την κλάση WeakReference για να δημιουργήσεις references τα οποία δεν εμποδίζουν το garbage collection ενός αντικειμένου. Έτσι όμως θα έχεις πρόβλημα με null references μέσα στα collections. Μπορείς να κάνεις dispose το αντικείμενο σου μόνο που και τότε θα έχεις ένα αντίστοιχο πρόβλημα, με τη διαφορά ότι τώρα θα έχεις ένα "σκοτωμένο" αντικείμενο αντί για null reference.
Νομίζω ότι θα πρέπει να ξανασκεφτείς το object model σου. Η όλη ιδέα του garbage collection είναι ότι δεν σε ενδιαφέρει και τόσο πότε καταστρέφεται ένα αντικείμενο. Μήπως το έχεις παρακάνει με τα πολλά collections? Ένα collection παρέχει δύο υπηρεσίες: "κρατάει" αντικείμενα και παρέχει τρόπο αναζήτησης και enumeration. Υποθέτω ότι για να έχεις το ίδιο αντικείμενο σε πολλά διαφορετικά collections μάλλον θέλεις διαφορετικούς τρόπους αναζήτησης ή enumeration. Αυτό όμως μπορείς να το πετύχεις καλύτερα χρησιμοποιώντας είτε εξειδικευμένα functions για την αναζήτηση, είτε δημιουργώντας iterators τα οποία θα δουλεύουν όπως θες.
Επίσης, αν χρησιμοποιείς τα collections για να δημιουργήσεις ουσιαστικά διαφορετικά "views" των δεδομένων σου, η καλύτερη λύση θα είναι να χρησιμοποιείς προσωρινά collections στη μνήμη. Αν για παράδειγμα θέλεις να επιστρέψεις μόνο τους πρώτους 5 πελάτες μπορείς να τους επιστρέψεις ως List<Customer> από το Data Layer σου αλλά να μην αποθηκεύσεις αυτό το collection στο business ή στο presentation layer.
Το LINQ σου δίνει άλλη μία λύση καθώς σου επιτρέπει να κάνεις queries τα οποία επιστρέφουν τα δεδομένα με όποια μορφή θέλεις χωρίς να πρέπει εσύ να χειριστείς πολλαπλά collections. Κρατάς τα αντικείμενα σου σε ένα κεντρικό collection και μετά κάνεις queries επάνω σε αυτό.
Αν δώσεις περισσότερες λεπτομέρειες για το τί προσπαθείς να κάνεις ίσως να υπάρχουν και άλλες λύσεις.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos