铸造是否会创建新对象?

时间:2011-02-21 09:59:03

标签: c# casting

我在这里很不确定:

Image i=some image...

Bitmap B=(Bitmap)i;

B现在指向与i相同的对象。我很困惑......我会说Bitmap B会指向一个新的Image实例,它被转换为位图,但显然并非如此。然后我就不知道它是如何运作的。

4 个答案:

答案 0 :(得分:33)

Casting不会创建新对象(至少,除非已定义new conversion operators,否则在非数字类型中不常见,并且不适用于您的示例)。它只是指示编译器如何“处理”一个对象。在你出现的情况下,你告诉编译器“别担心,相信我,B实际上是Bitmap”。如果事实证明你已经告诉它了,那么运行时会通过在运行时抛出InvalidCastException来抓住它。

MSDN有更多信息。

  

强制转换是一种明确告知编译器您打算进行转换并且您知道可能发生数据丢失的方法

答案 1 :(得分:2)

Dog 动物的一种特殊形式。狗具有特定于狗的属性和行为(barklickPrivateParts),但也具有该群组的所有成员共有的属性和行为动物numberOfChromosomesbreatheeat等。)。

如果你将一只狗施放到动物身上,你就是 upcasting (将一个更专业的类视为不太专业的基类)。在转换为Animal时,编译器/运行时将“看到”狗作为基本的动物和狗特定的属性和行为将不适用于这种最大的狗动物。这是有道理的,因为,例如,一般动物不会'吠叫'。

当你这样做时,你不是在创建一个新的Animal实例,而是使用Dog,好像它是一个不太专业的Animal对象。

同样,如果将位图转换为图像,您将(在将Bitmap视为图像的持续时间内)只能访问Image的字段/属性,而不能访问Bitmap。

要提一点的是,您在示例中所做的是向下转换(从较不专业的对象转移到更专业的对象)。这并不总是安全或合理的 - 如果您考虑一下,Animal类的实例没有Dog特定属性的值或定义。

答案 2 :(得分:0)

使用新的Obj()创建新对象时;创建一个新对象。将该对象转换为另一个对象类型时,该对象保持不变,只有运行时才能将该对象作为不同类型使用。

您可以将列表强制转换为IEnumerable,并使用与IEnumerable类型相同的列表对象进行工作。

这只适用于   - 要转换为的对象是要转换的对象的基类。   - 要转换的对象实现要转换的接口。   - 该对象为结果类型提供特定的强制转换。 (使用显式运算符)。

答案 3 :(得分:-3)

你在做什么看起来不明智! BitmapImage的子类,因此您始终可以使用Bitmap对象并将其称为Image,但您不能保证任何特定{ {1}}是Image。如果不是,您将最终抛出异常。

您可以从Bitmap创建新的Bitmap,但您必须通过创建新实例来完成此操作,例如

Image

这不是强制转换,即创建一个新的Image i = some image... Bitmap b = new Bitmap(i); 对象,但是a)合法且b)合理。