装箱/拆箱和类型转换有什么区别?
装箱/拆箱和类型转换有什么区别?
通常,这些术语似乎可以互换使用。
What is the difference between boxing/unboxing and type casting?
Often, the terms seem to be used interchangeably.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
装箱是指将不可空值类型转换为引用类型或将值类型转换为其实现的某个接口(例如将代码>)。 此外,基础值类型到可为空类型的转换也是装箱转换。 (警告:本主题的大多数讨论都会忽略后两种类型的转换。)
int
转换为IComparable
IComparable例如,
将
i
转换为object
类型的实例。拆箱是指从
object
或ValueType
实例到不可空值类型的显式转换,即接口类型到不可空值类型的转换(例如,IComparable
到int
)。 此外,可空类型到基础类型的转换也是拆箱转换。 (警告:此主题的大多数讨论将忽略后两种类型的转换。)例如,
将
o
中装箱的整数转换为int
类型的实例。类型转换是将表达式显式转换为给定类型。 因此
显式地将
表达式
转换为type
类型的对象。Boxing refers to a conversion of a non-nullable-value type into a reference type or the conversion of a value type to some interface that it implements (say
int
toIComparable<int>
). Further, the conversion of an underlying value type to a nullable type is also a boxing conversion. (Caveat: Most discussions of this subject will ignore the latter two types of conversions.)For example,
converts
i
to an instance of typeobject
.Unboxing refers to an explicit conversion from an instance of
object
orValueType
to a non-nullable-value type, the conversion of an interface type to a non-nullable-value type (e.g.,IComparable<int>
toint
). Further, the conversion of a nullable type to the underlying type is also an unboxing conversion. (Caveat: Most discussion of this subject will ignore the latter two types of conversions.)For example,
converts the integer boxed in
o
to an instance of typeint
.A type cast is an explicit conversion of an expression to a given type. Thus
explicitly converts
expression
to an object of typetype
.装箱和拆箱是类型转换的子集。 装箱是将值类型视为引用类型的行为(实际上,涉及将该值类型的内容(从堆栈)复制到堆并返回对该对象的引用)。 这允许在任何需要兼容引用类型的地方传递值类型。 它还允许在值类型上执行虚拟方法调用和引用类型的其他功能。 拆箱是此操作的逆操作(从装箱对象中取回值类型)。
类型转换是用于从特定类型的变量到另一种类型的任何类型转换的术语。 这是一个更广泛的概念。
几分钟前我回答了一个涵盖这种差异的相关问题。 总而言之,我对 C# 转换运算符生成的不同类型的 IL 指令进行了分类:
box
IL 指令)和拆箱(unbox
IL 指令)dynamic_cast
,使用castclass
IL指令来验证)static_cast
,有大量用于基元类型之间不同类型转换的 IL 指令)op_XXX
方法的方法调用)。Boxing and unboxing is a subset of type casts. Boxing is the act of treating a value type as reference type (which in practice, involves copying the contents of that value type (from stack) to the heap and returning a reference to that object). This allows a value type to be passed wherever a compatible reference type is expected. It also allows virtual method calls and other features of reference types to be performed on the value type. Unboxing is the reverse of this operation (getting back a value type out of a boxed object).
Type cast is the term used for any type of conversion from a variable of specific type to another. It's a broader concept.
A few minutes ago I answered a related question that covers this difference. To summarize, I categorized different types of IL instructions generated by C# cast operator:
box
IL instruction) and unboxing (unbox
IL instruction)dynamic_cast<Type>
in C++, usescastclass
IL instruction to verify)static_cast<Type>
in C++, there are plenty of IL instructions for different types of casts between primitive types)op_XXX
method).装箱是将值类型(int、double、float、Guid 等)转换为引用类型(System.Object、System.String 等)的术语。 执行此装箱操作会在堆上分配内存(垃圾收集器最终需要回收这些内存)。 拆箱是此过程的逆过程,获取引用类型并将其转换为值类型。
强制转换是采用一种类型(例如 System.Object)并将其视为另一种类型(例如 System.String)。
当您在 C# 中装箱某些内容时,您正在将其转换为另一种类型。 区别在于,它在创建新引用类型时分配额外的内存。
底线:装箱是一种特殊类型的转换,它将值类型转换为引用类型,这需要分配新的引用类型。
Boxing is the term for turning a value type (int, double, float, Guid, etc.) into a reference type (System.Object, System.String, etc.). Doing this boxing operation allocates memory on the heap (which the garbage collector will eventually need to reclaim). Unboxing is the reverse of this process, taking a reference type and turning it into a value type.
Casting is taking a type (say, System.Object) and treating it as another type (say, System.String).
When you box something in C#, you are casting it to another type. The difference is that it allocates additional memory as a new reference type is created.
Bottom line: boxing is a special kind of cast that converts a value type to a reference type, which requires the allocation of a new reference type.
装箱/拆箱和类型转换是两种不同的操作,但它们使用相同的语法。
仅当谈论它的人不知道到底发生了什么时,它们才可以互换使用......
装箱是将值类型作为对象存储在堆上,而拆箱则是从对象中读取值。 您只能将值拆箱,因为它是精确类型。
强制转换是指将一个基本类型转换为另一个基本类型(例如从到
int
到long
),或者更改引用的类型(例如从int
到long
)。 >ListIEnumerable
)。Boxing/unboxing and type casting are two different operations, however they use the same syntax.
They are only used interchangeably when the person talking about it doesn't know what's really happening...
Boxing is storing a value type as an object on the heap, and unboxing is reading the value from the object. You can only unbox the value as it's exact type.
Casting is when you convert a basic type to another basic type (like from an
int
to along
), or when you change the type of a reference (like fromList<int>
toIEnumerable<int>
).装箱意味着将值类型变量(即整数)转换为引用类型。 拆箱与此相反,使用类型转换。 简而言之,在 .NET 世界中,一切都源自“对象”类型。
例如(C# 示例):
这样做的要点是类型系统的统一,允许将值类型视为引用类型。 本文更深入地介绍了装箱/拆箱。
Boxing means converting a value type variable (i.e. an integer) to a reference type. Unboxing is the reverse of that, using type casting. In the .NET world, everything derives from the "object" type in a nutshell.
For example (C# example):
The take-away from this is the unification of the type system, allowing value-types to be treated as reference types. This article has a more indepth look at boxing/unboxing.
装箱(隐式)
拆箱(显式)
Boxing (Implicit)
Unboxing (Explicit)