実装するインターフェースへの参照がある間、オブジェクトは存続しますか?

.net c# garbage-collection interface
実装するインターフェースへの参照がある間、オブジェクトは存続しますか?

インターフェイスを実装するクラスがあります。 そのクラスのオブジェクトへの参照は必要ありません-それらのインターフェイスへの参照のみです。 それはように見えます:

interface A {}

class B : A {}

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

私の質問は次のとおりです。Bのインスタンスは存続しますか(GCによって収集されません)、そのBのAへの参照がありますか?

  1  0


ベストアンサー

はい、そのインターフェース「A」を実装する部分のみを見ることができますが、まだその「新しいB()」への参照があるためです。

4


参照は、変数がクラスまたはインターフェイスとして入力されているかどうかに関係なく、実際の値と同じです。 はい、それは生き続けます。

1


はい、オブジェクトのインスタンスは同じです。オブジェクトを実装された任意のインターフェイスにキャストできますが、インスタンスは1つです。

1


はい。インターフェイスを介したオブジェクトへの参照は、そのオブジェクトへの参照のままです。

オブジェクトをインターフェイスにキャストしても、新しいオブジェクトは作成されず、オブジェクトと通信するために使用する「ポータル」が変更されるだけです。

これはhttp://linqpad.net [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サイクル全体で生き残ったことに注意してください。

1


タイトルとURLをコピーしました