我有一个实现接口的类。我不需要引用该类的对象 - 仅引用它们的接口。它看起来像:
interface A {}
class B : A {}
//in code:
A a = (A) new B();
我的问题是:当我提到B的A时,B的实例是否会生存(不是由GC收集)?
答案 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循环中幸存下来。