铸造,拆箱,转换..?

时间:2011-01-19 11:41:48

标签: c# boxing value-type

最近我正在学习价值类型,我有点困惑。同时,转换和拆箱都使用相同的语法 - (预期类型)(对象),对吧? 那么类型之间的简单转换呢,即转换或转换?

int x = (int)2.5; //casting?

object a=x;
int Y=(int)a;  //unboxing I think

Random r=new Random();
object X=r;
Random R=(Random)X;  // casting

5 个答案:

答案 0 :(得分:8)

这里有很多事情要考虑,但让我们先解决最简单的问题:

语法(type)expression是什么?

嗯,在它的基本形式中,它被认为是铸造。您将表达式从一种类型转换为另一种类型。就是这样。

然而,究竟发生了什么,这取决于类型和许多其他事情。

如果将值类型转换为其他类型,则依赖于所涉及的两种类型之一来声明处理此类型的转换运算符。换句话说,值类型需要定义可以转换为其他类型的转换运算符,或者其他类型需要定义可以从原始类型转换的转换运算符。

该运营商所做的事情取决于该运营商的作者。这是一种方法,所以它可以做任何事情。

将值类型转换为其他类型会为您提供不同的值,单独的值类型或新的引用类型,包含转换后的新数据。

示例:

int a = (int)byteValue;

当您在引用类型(通常是object)或值类型实现的接口之一上转换值类型时,可以使用装箱和拆箱。

示例:

object o = intValue; // boxing
int i = (int)o;      // unboxing

拳击也在投射到界面时发挥作用。我们假设“someValueType”是一个结构,它也实现了IDisposable:

IDisposable disp = (IDisposable)someValueType; // boxed

投射引用类型,也可以做其他事情。

首先,您可以定义与值类型相关的相同转换运算符,这意味着将一个引用类型转换为另一个引用类型可以返回一个全新的对象,其中包含完全不同类型的信息。

在投射引用类型时,Boxing不起作用,除非您将引用类型转换回值类型(参见上文。)

示例:

string s = (string)myObjectThatCanBeConvertedToAString;

或者,您可以重新解释引用,这样您仍然可以引用相同的对象,但是您通过一副不同类型的眼镜来查看它。

示例:

IDisposable disp = (IDisposable)someDisposableObject;

答案 1 :(得分:2)

取消装箱的一个重要限制是,您只能取消打包到精确的值类型(或其可空的等价物),而不能转换为原始值类型可转换为的其他值类型。

int myInt = 1;
object x = myInt; // box
int  unbox1 = (int)x;  // successful unbox
int? unbox2 = (int?)x; // successful unbox
long unbox3 = (long)x; // error. Can't unbox int to long
long unbox4 = (long)(int)x; // works. First it unboxes to int, and then converts to long

另一个有趣的是,可空值的类型被装箱为非可空类型,并且可以作为可空类型和非可空类型进行拆箱。由于可引用的值为null的值为null,因此在拳击过程中会丢失有关其类型的信息。

答案 2 :(得分:1)

演员阵容基本上是一种转换形式。

代码中的所有注释都是正确的。

然而,注意引用转换与其他转换之间的区别非常重要。您展示的最终转化是参考转化 - 它维护代表性身份,因此XR的值都是对同一对象的引用。

将此与doubleint转化(显着更改)和拆箱(将框内的值复制到变量)进行比较。

区别对于某些主题非常重要,例如泛型差异 - 由于可用的参考转换,仅适用于引用类型。基本上,CLR会检查所有类型是否合适,然后运行相应的代码,而无需对引用本身执行任何实际转换。

答案 3 :(得分:1)

Boxing和Unboxing专门引用转换值类型来引用类型,然后再引用。请查看此链接以获取更多Boxing and Unboxing (C# Programming Guide)

答案 4 :(得分:0)

拳击和拆箱是由编译器在幕后完成的。所以正确的评论将是

int x = (int)2.5; //casting with conversion

object a=x; //casting with boxing
int Y=(int)a;  //casting with unboxing

Random r=new Random();
object X=r;
Random R=(Random)X;  //casting without unboxing

关于投射与转化检查此问题:What is the difference between casting and conversion?