Будет ли объект жить, пока есть ссылка на интерфейс, который он реализует? - PullRequest
1 голос
/ 30 сентября 2011

У меня есть класс, реализующий интерфейс.Мне не нужна ссылка на объекты этого класса - только ссылка на их интерфейсы.Это выглядит так:

interface A {}

class B : A {}

//in code:
A a = (A) new B();

Мой вопрос таков: будет ли экземпляр B жить (не собирать GC), пока у меня есть ссылка на A этого B?

Ответы [ 4 ]

4 голосов
/ 30 сентября 2011

Да, потому что у вас все еще есть ссылка на этот new B(), хотя вы можете видеть только ту часть, которая реализует этот интерфейс A.

1 голос
/ 30 сентября 2011

Да, поскольку ссылка на объект через интерфейс по-прежнему является ссылкой на этот объект.

Приведение объекта к интерфейсу не создает новый объект, оно просто изменяет «портал», через который вы общаетесь с объектом.

Вы можете легко проверить это в LINQPad :

void Main()
{
    A a = (A)new B();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.KeepAlive(a);
    Debug.WriteLine("Got here");
}

public interface A
{
}

public class B : A
{
    ~B()
    {
        Debug.WriteLine("B was finalized");
    }
}

При выполнении вы получите:

попал сюда

А затем, необязательно:

B был завершен

Но обратите внимание, что B пережил полный цикл GC, хотя у вас была ссылка на него через A.

1 голос
/ 30 сентября 2011

да, экземпляр объекта такой же, вы можете привести объект к любому из реализованных интерфейсов, но экземпляр - один.

1 голос
/ 30 сентября 2011

Ссылка является фактическим значением независимо от того, указана ли ваша переменная как класс или интерфейс. Так что да: он останется в живых.

...