装箱/拆箱和类型转换有什么区别?

发布于 2024-07-27 00:43:35 字数 50 浏览 4 评论 0原文

装箱/拆箱和类型转换有什么区别?

通常,这些术语似乎可以互换使用。

What is the difference between boxing/unboxing and type casting?

Often, the terms seem to be used interchangeably.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

前事休说 2024-08-03 00:43:35

装箱是指将不可空值类型转换为引用类型或将值类型转换为其实现的某个接口(例如将 int 转换为 IComparableIComparable代码>)。 此外,基础值类型到可为空类型的转换也是装箱转换。 (警告:本主题的大多数讨论都会忽略后两种类型的转换。)

例如,

int i = 5;
object o = i;

i 转换为 object 类型的实例。

拆箱是指从 objectValueType 实例到不可空值类型的显式转换,即接口类型到不可空值类型的转换(例如,IComparableint)。 此外,可空类型到基础类型的转换也是拆箱转换。 (警告:此主题的大多数讨论将忽略后两种类型的转换。)

例如,

object o = (int)5;
int i = (int)o;

o 中装箱的整数转换为 int 类型的实例。

类型转换是将表达式显式转换为给定类型。 因此

(type) expression

显式地将表达式转换为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 to IComparable<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,

int i = 5;
object o = i;

converts i to an instance of type object.

Unboxing refers to an explicit conversion from an instance of object or ValueType to a non-nullable-value type, the conversion of an interface type to a non-nullable-value type (e.g., IComparable<int> to int). 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,

object o = (int)5;
int i = (int)o;

converts the integer boxed in o to an instance of type int.

A type cast is an explicit conversion of an expression to a given type. Thus

(type) expression

explicitly converts expression to an object of type type.

凡间太子 2024-08-03 00:43:35

装箱和拆箱是类型转换的子集。 装箱是将值类型视为引用类型的行为(实际上,涉及将该值类型的内容(从堆栈)复制到堆并返回对该对象的引用)。 这允许在任何需要兼容引用类型的地方传递值类型。 它还允许在值类型上执行虚拟方法调用和引用类型的其他功能。 拆箱是此操作的逆操作(从装箱对象中取回值类型)。

类型转换是用于从特定类型的变量到另一种类型的任何类型转换的术语。 这是一个更广泛的概念。

几分钟前我回答了一个涵盖这种差异的相关问题。 总而言之,我对 C# 转换运算符生成的不同类型的 IL 指令进行了分类:

  1. 装箱(box IL 指令)和拆箱(unbox IL 指令)
  2. 通过继承层次结构进行转换(例如C++中的dynamic_cast,使用castclass IL指令来验证)
  3. 原始类型之间的转换(如C++中的static_cast,有大量用于基元类型之间不同类型转换的 IL 指令)
  4. 调用用户定义的转换运算符(在 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:

  1. Boxing (box IL instruction) and unboxing (unbox IL instruction)
  2. Casting through the inhertiance hierarchy (like dynamic_cast<Type> in C++, uses castclass IL instruction to verify)
  3. Casting between primitive types (like static_cast<Type> in C++, there are plenty of IL instructions for different types of casts between primitive types)
  4. Calling user defined conversion operators (at the IL level they are just method calls to the appropriate op_XXX method).
拥抱没勇气 2024-08-03 00:43:35

装箱是将值类型(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.

纵山崖 2024-08-03 00:43:35

装箱/拆箱和类型转换是两种不同的操作,但它们使用相同的语法。

仅当谈论它的人不知道到底发生了什么时,它们才可以互换使用......

装箱是将值类型作为对象存储在堆上,而拆箱则是从对象中读取值。 您只能将值拆箱,因为它是精确类型。

强制转换是指将一个基本类型转换为另一个基本类型(例如从 intlong),或者更改引用的类型(例如从 intlong)。 >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 a long), or when you change the type of a reference (like from List<int> to IEnumerable<int>).

场罚期间 2024-08-03 00:43:35

装箱意味着将值类型变量(即整数)转换为引用类型。 拆箱与此相反,使用类型转换。 简而言之,在 .NET 世界中,一切都源自“对象”类型。

例如(C# 示例):

int myInt = 0;                 // original variable (unboxed to begin with)
object boxed = myInt;          // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

这样做的要点是类型系统的统一,允许将值类型视为引用类型。 本文更深入地介绍了装箱/拆箱。

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):

int myInt = 0;                 // original variable (unboxed to begin with)
object boxed = myInt;          // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

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.

同展鸳鸯锦 2024-08-03 00:43:35

装箱(隐式)

  • 过程
  • 值类型转换为引用类型或任何类型的 由值类型实现的接口类型。
  • 当 CLR 装箱值类型时,它会将值包装在 System.Object.Instance 中并将其存储在托管堆上
  • 示例
    int number = 12;
    对象框=数字;

拆箱(显式)

  • 引用类型转换为值类型的过程>
  • 接口类型类型转换的任何值类型
  • 或者从任何接口类型到实现此场景中所需的
  • 。 示例
    对象框 = 12;
    int 数字 = (int)box;

Boxing (Implicit)

  • Process of converting Value type to Reference type
  • Or to any interface type implemented by the value-type.
  • when CLR boxes a value type, it wraps the value inside a System.Object.Instance and store it on the managed heap
  • Example
    int number = 12;
    object box = number;

Unboxing (Explicit)

  • Process of converting Reference type to Value type
  • Or from any interface-type to any value-type that implements the interface-type
  • Type casting require in this scenario.
  • Example
    object box = 12;
    int number = (int)box;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文