Erstellt das Casting ein neues Objekt?

8

Ich bin mir ziemlich unsicher:

%Vor%

Das B zeigt jetzt auf dasselbe Objekt wie ich. Ich bin verwirrt ... Ich würde sagen, dass Bitmap B auf eine neue Instanz von Image zeigt, die in Bitmap umgewandelt wird, aber das ist offensichtlich nicht der Fall. Dann verstehe ich einfach nicht, wie es hier funktioniert.

    
FlyBoy 21.02.2011, 09:59
quelle

4 Antworten

29

Casting erstellt kein neues Objekt (zumindest nicht, solange nicht neu ist Konvertierungsoperatoren wurden definiert, was bei nicht numerischen Typen ungewöhnlich ist und in Ihrem Beispiel nicht zutrifft. Es weist den Compiler lediglich an, ein Objekt "zu behandeln". In dem Fall, dass Sie präsentieren, sagen Sie dem Compiler "Mach dir keine Sorgen, vertrau mir, B ist eigentlich ein Bitmap ". Wenn es sich herausstellt, dass Sie es als Fake bezeichnet haben, wird Sie die Laufzeit davon ablenken, indem Sie zur Laufzeit ein InvalidCastException werfen.

MSDN enthält weitere Informationen.

  

Ein Cast ist eine Möglichkeit, den Compiler explizit darüber zu informieren, dass Sie die Konvertierung durchführen möchten und dass Sie wissen, dass Datenverluste auftreten können.

    
Michael Petrotta 21.02.2011, 10:03
quelle
1

Ein Hund ist eine spezielle Form von Tier . Hunde haben hundespezifische Eigenschaften und Verhaltensweisen ( bark , lickPrivateParts ), haben aber die Eigenschaften und Verhaltensweisen, die allen Mitgliedern der Gruppe Tier gemeinsam sind ( numberOfChromosomes , breathe , eat usw.).

Wenn Sie einen Hund nach Tier umwandeln, werden Sie upcasting (Behandeln einer spezielleren Klasse als weniger spezialisierte Basisklasse). Während der Umwandlung in Animal 'sieht' der Compiler / Laufzeit den Hund als ein grundlegendes Tier, und hundespezifische Eigenschaften und Verhalten sind für dieses aufgeschlossene Hund-Tier nicht verfügbar. Dies ist sinnvoll, da beispielsweise ein generisches Tier nicht bellt.

Sie erstellen keine neue Animal-Instanz, wenn Sie dies tun, sondern Sie verwenden den Hund, als ob es ein weniger spezialisiertes Animal-Objekt wäre.

Wenn Sie eine Bitmap auf ein Bild anwenden, können Sie (für die Dauer der Bearbeitung Ihrer Bitmap als Bild) nur auf die Felder / Eigenschaften von Image und nicht auf Bitmap zugreifen.

Ein Punkt, den Sie erwähnen sollten, ist, dass Sie in Ihrem Beispiel downcasting tun (von einem weniger spezialisierten zu einem spezialisierteren Objekt). Dies ist nicht immer sicher oder sinnvoll - wenn Sie darüber nachdenken, hat eine Instanz der Animal-Klasse keine Werte oder Definitionen für die hundespezifischen Attribute.

    
5arx 21.02.2011 10:24
quelle
0

wenn Sie ein neues Objekt mit new Obj () erstellen; Ein neues Objekt wird erstellt. Wenn Sie dieses Objekt in einen anderen Objekttyp umwandeln, bleibt das Objekt unverändert, nur die Laufzeitumgebung arbeitet mit dem Objekt als einem anderen Typ.

Sie können eine Liste nach IEnumerable umwandeln und ab diesem Zeitpunkt mit demselben Listenobjekt arbeiten, das dem Typ IEnumerable entspricht.

Das funktioniert nur, wenn  - Das Objekt, in das Sie konvertieren möchten, ist eine Basisklasse des Objekts, das gegossen werden soll.  - Das Objekt, das gegossen werden soll, implementiert die Schnittstelle, auf die es geworfen werden soll.  - Das Objekt bietet eine spezifische Umwandlung für den resultierenden Typ. (mit expliziten Operator).

    
Joep Killaars 21.02.2011 10:03
quelle
-3

Was du machst, sieht nicht vernünftig aus! A Bitmap ist eine Unterklasse von Image , Sie können also immer ein Bitmap -Objekt nehmen und es als Image bezeichnen, aber Sie können nicht garantieren, dass ein bestimmtes Image ein Bitmap ist. Wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst.

Sie können ein neues Bitmap aus einem Image erstellen, aber Sie müssen das tun, indem Sie eine neue Instanz erstellen, wie

%Vor%

Das wirft nicht, das schafft ein neues Bitmap -Objekt, ist aber a) legal und b) sinnvoll.

    
AAT 21.02.2011 10:04
quelle

Tags und Links