Связывание объекта с другим объектом для очистки GC - PullRequest
4 голосов
/ 23 марта 2010

Есть ли способ связать экземпляр объекта (объект A) со вторым объектом (объект B) обобщенным образом, чтобы, когда B собирали, A становился приемлемым для сбора? То же самое поведение, которое произошло бы, если бы B имел переменную экземпляра, указывающую на A, но без явного изменения определения класса B и возможности делать это динамически?

Такой же эффект может быть реализован с помощью забавного использования события Component.Disposed, но я не хочу делать B одноразовым

EDIT

Я в основном создаю кеш объектов, которые связаны с одним «корневым» объектом, и я не хочу, чтобы кеш был статичным, так как может быть много корневых объектов, использующих разные кеши, поэтому память будет израсходована, когда корневой объект больше не используется, но кэшированные объекты все еще существуют.

Итак, я хочу, чтобы коллекция кэшированных объектов была связана с каждым «корневым» объектом без изменения определения корневого объекта. Тип метаданных дополнительной ссылки на объект, прикрепленной к каждому экземпляру корневого объекта. Таким образом, каждая коллекция будет собираться при получении корневого объекта и не зависать, как если бы использовался статический кеш.

Ответы [ 2 ]

1 голос
/ 23 марта 2010
public class RelatedReference<A, B>
{
    private A a;
    private B b;

    public B Referent
    {
        get {return b;}
    }

    public RelatedReference(A a, B b)
    {
        this.a = a; 
        this.b = b;
    }
}

Тогда просто используйте RelatedReference каждый раз, когда вы будете использовать B следующим образом:

    var Bref = new RelatedReference<A, B>(new A(), new B());
    Bref.Referent.Foo();
1 голос
/ 23 марта 2010

Краткий ответ: Вероятно, нет. Можете ли вы объяснить больше того, что вы пытаетесь сделать? Возможно, вам понадобится WeakReference.

...