ここにはコードがあります:
Base b = new Derived(); // Upcasting
// Some actions
Derived d = (Derived)b; // Downcasting
私が理解しているように、参考文献はステンシルあなたはデリバティブクラスで追加されたメンバーにアクセスできないように、アップキャストするだけでそのステンシルを絞り込みます。
質問は: 派生した型のパーツへの参照は保存されていないため、ベースのみです。ダウンキャストが発生した時点で、GCの一部のアクションまたはアクティビティがDerivedメンバーを含むメモリのチャンクを消去または上書きすることがありますか?言い換えれば、ダウンキャストできる Derived d = (Derived)b
失敗?
回答:
回答№1は1それは文脈の中で安全なキャストです。 Derived
インスタンス それはなぜそれが常に治療するのが安全か 派生として導出; GCなし 活動が損なわれる インスタンスの一部。鋳造は一種の
処理 (私は 実際の Derived
存在としての意識
Base
私はメソッドやプロパティのサブセットだけを呼び出すと約束しています) そして それ自体に鋳造する は 常に安全です.
// Actual instance is derived, but I"m going to restrict
// my work with them: I"ve promissed not to call for "b"
// any derived methods/properties
Base b = new Derived();
// What is the actual type of "b"?
String typeName = b.GetType().Name; // <- "Derived"
// Try to convert to Derived
// This"s better way to cast then (Derived) b
Derived d = b as Derived;
// Since "b" is actually Derived d will ne not null
if (Object.RefrenceEquals(null, d)) {
Console.Write("b is Derived");
}
// You can also check
if (b is Derived) {
Console.Write("b is a Derived instance.");
}
回答№2については2
変数は、実際のオブジェクトが存在するメモリ位置を指します。型のオブジェクトを作成した場合 Derived
変数は、この型のインスタンスが格納されているメモリ位置を指します。あなたが基本型を使っていても Base
メモリ内のインスタンスは、インスタンス化した型のインスタンスです。ダウンキャストはあなたが確信している限り失敗することはありません b
タイプは Derived
.
回答№3の場合は0
いいえ、情報を失うことはありません。しかし、その情報が最初に存在しなかった場合、キャストは失敗する可能性があります。 bが型Derivedまたは派生型でない場合は、例外がスローされます。
Base b = new b();
// Some actions
Derived d = (Derived)b; // will fail, b never was of type Derived.
回答№4の場合は0
1)時間によって "GCが消去されます... あなたのコード "=(派生した)b" bはメモリに残っていません。もちろん、それは失敗しますが、あなたが弱参照で遊んでいない限り、GCはそれを消去してはいけません。
2)ベースb =新規導出(); なぜあなたはこれをやりたいのか理解していない "アップキャスト"。 あなたのコードは既にDerivedの強い参照/型を持っていますが、Derived b = ....を使うこともできます