一个对象是否存在,而它引用了它实现的接口?

时间:2011-09-30 09:09:47

标签: c# .net interface garbage-collection

我有一个实现接口的类。我不需要引用该类的对象 - 仅引用它们的接口。它看起来像:

interface A {}

class B : A {}

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

我的问题是:当我提到B的A时,B的实例是否会生存(不是由GC收集)?

4 个答案:

答案 0 :(得分:4)

是的,因为您仍然可以参考new B(),但您只能看到实现该界面的部分A

答案 1 :(得分:1)

无论您的变量是作为类还是接口键入,引用都是相同的实际值。所以是的:它会活着。

答案 2 :(得分:1)

是对象的实例是相同的,您可以将对象强制转换为其实现的任何接口,但实例是一个。

答案 3 :(得分:1)

是的,因为通过接口对对象的引用仍然是对该对象的引用。

将对象转换为接口不会创建新对象,它只会改变您用来与对象通信的“门户”。

您可以在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最终确定

但请注意,即使你通过A引用了它,B也能在整个GC循环中幸存下来。